2013-03-26 13 views
5

Sono incredibilmente nuovo a Jackson e ho un problema con la comprensione di come potrei realizzare qualcosa.Jackson Custom Mapper per convertire Byte Array in stringa

Ho alcuni dati di tipo byte[] (i dati si trovano all'interno delle classi generate da JAXB). Prima che i dati vengano inviati al browser, Jackson quindi (credo) lo trasforma in JSON in modo che la pagina Web possa consumarlo. Almeno questa è la mia comprensione cruda, finora.

I dati JSON mostrano il mio byte [] come stringhe, che non corrispondono al display che vogliamo. Ad esempio, i dati effettivi potrebbero essere CAFEDEAD ma la stringa JSON è simile a 3q2+78r+. Vorrei che il JSON contenga la stringa CAFEDEAD

La mia domanda è, posso scrivere qualcosa di personalizzato per Jackson che prima di creare il JSON finale, trasformare i dati byte[] in una stringa esadecimale leggibile? O se no, quali altre opzioni ho?

Ho accesso al javascript quindi se c'è un modo per riattivare la stringa JSON, sono pronto anche per quello.

+1

Perché è importante il modo in cui il JSON propaga i dati binari? Sembra che sia probabilmente Base64: decodifica quindi base64 per recuperare i dati binari originali, quindi puoi visualizzarli come desideri. –

+0

Darà un'idea a questa immagine, grazie Jon! – Robb

+0

Per favore ci mostri il codice – Jason

risposta

-1

È possibile utilizzare le annotazioni @JsonSerialize e @JsonDeSerialize su qualsiasi proprietà. javadoc è a

http://jackson.codehaus.org/1.2.1/javadoc/org/codehaus/jackson/map/annotate/JsonSerialize.html 

io personalmente utilizzare la tecnica di serializzazione/deserializzazione, piuttosto che di conversione del lato client come probabilmente si finisce per farlo a più posti.

0

Senza alcun codice, ho dovuto indovinare cosa stai facendo in base alla tua domanda. Questo tutorial JSON parse to/from using Jackson mostra come convertire ObjectMapper ad una rappresentazione Stringfiyed di JSON per esempio

"{"age":29,"messages":["msg 1","msg 2","msg 3"],"name":"mkyong"}" 

Poi quando il client JavaScript riceve questa stringa, si sta andando ad avere per analizzare questo utilizzando sia costruito in funzione di parsing JSON o jQuery fornito uno. Come

... 
    var myJson = JSONString.parse() | jQuery.parseJSON(JSONString); 
    .. 

    myJson.age; //29 
    myJson.name; //"mkyong" 

Motivo per aver tentato di analizzarlo usando parse() è prima per evitare di utilizzare jQuery, mentre v'è già un costruito in funzione di questo fornito da browser. Tuttavia, se questa funzione non viene rilevata, la analizzerà tramite jQuery.

Spero che questo aiuta

per l'interesse

Il vostro esempio i dati sembra essere un qualche tipo di dati binari e si sta tentando di inviare sulle reti. Ciò potrebbe causare il filtraggio di questi dati da parte dei router. Se sei interessato, puoi dare un'occhiata a codificare questi dati in Base64 prima di trasmetterli al client. È molto facile da fare perché ci sono già molte librerie là fuori.

Some resources regarding to this topic.

Così sta per essere come

SERVER 
    1) Jackson creates JSON String 
    2) Server encodes into Base64 
    3) Send 

CLIENT 
    1) Receive 
    2) Decode base64 
    3) parse JSON String 
+0

Puoi spiegarmi perché ho ricevuto il downvote? – Jason

1

Nota: Sono in vantaggio EclipseLink JAXB (MOXy) e un membro del gruppo di esperti JAXB (JSR-222).

Di seguito è riportato come è possibile supportare questo caso d'uso con MOXy come provider di binding JSON.

Java Modello

Per impostazione predefinita un'implementazione JAXB convertirà un byte[] a base64Binary. È possibile utilizzare HexBinaryAdapter per rappresentarlo come hexBinary.

package forum15643723; 

import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    private byte[] foo; 

    @XmlJavaTypeAdapter(HexBinaryAdapter.class) 
    private byte[] bar; 

} 

Demo

Nel codice demo di seguito leggeremo il JSON in oggetti e poi scrivere di nuovo a JSON.

package forum15643723; 

import java.util.*; 
import javax.xml.bind.*; 
import javax.xml.transform.stream.StreamSource; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(); 
     properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json"); 
     properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {Root.class}, properties); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     StreamSource json = new StreamSource("src/forum15643723/input.json"); 
     Root root = (Root) unmarshaller.unmarshal(json, Root.class).getValue(); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

jaxb.properties

Per specificare moxy come provider JAXB è necessario includere un file chiamato jaxb.properties nello stesso pacchetto come il modello di dominio (vedi: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html).

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

input.json/Output

I foo e bar proprietà rappresentano gli stessi dati. foo è rappresentato come base64Binary e bar è rappresentato come hexBinary.

{ 
    "foo" : "3q2+78r+", 
    "bar" : "DEADBEEFCAFE" 
} 

Per ulteriori informazioni

3

Jackson convertirà byte [] in dati binari con codifica Base64. Questo è il modo sicuro per passare il contenuto binario. Altrimenti non c'è modo di sapere quale codifica dei caratteri potrebbe essere usata dai dati contenuti, quindi provare a costruire una stringa al di fuori di essa sarebbe rischioso e soggetto a errori.

Quindi il modo più semplice sarebbe avere il ricevitore di base64 decodificare il contenuto in dati binari.

In alternativa, è possibile aggiungere un serializzatore personalizzato per trasformarsi in altre rappresentazioni (hex, base85), ma in realtà dipende dall'obiettivo.

Problemi correlati