2013-03-26 20 views
5

Ich bin unglaublich neu in Jackson und ich habe ein Problem mit dem Verständnis, wie ich etwas erreichen könnte.Jackson Custom Mapper zum Konvertieren von Byte-Array zu String

Ich habe einige Daten vom Typ byte[] (die Daten sind innerhalb der Klassen von JAXB generiert). Bevor die Daten an den Browser gesendet werden, verwandelt Jackson (glaube ich) es in JSON, damit die Webseite es konsumieren kann. Zumindest ist das mein grobes Verständnis, soweit.

Die JSON-Daten zeigen meine byte [] als Zeichenfolgen, die nicht mit der Anzeige übereinstimmen, die wir wollen. Zum Beispiel könnten die tatsächlichen Daten CAFEDEAD sein, aber die JSON-Zeichenfolge sieht wie 3q2+78r+ aus. Ich möchte, dass der JSON die Zeichenfolge CAFEDEAD

enthält. Meine Frage ist, kann ich etwas für Jackson benutzerdefinierte schreiben, dass, bevor es das endgültige JSON erstellt, die byte[] Daten in eine lesbare Hex-Zeichenfolge? Oder wenn nicht, welche anderen Möglichkeiten habe ich?

Ich habe Zugriff auf das Javascript also, wenn es eine Möglichkeit gibt, die JSON-Zeichenfolge zurück zu drehen, bin ich auch dafür.

+1

Warum ist es wichtig, wie der JSON die binären Daten verbreitet? Das klingt wahrscheinlich nach Base64 - entschlüssle also die base64, um die ursprünglichen Binärdaten zurück zu bekommen, und dann kannst du sie wie immer anzeigen lassen. –

+0

Wird diese Idee einen Schuss geben, danke Jon! – Robb

+0

Bitte zeigen Sie uns einen Code – Jason

Antwort

-1

Sie können @JsonSerialize- und @JsonDeSerialize-Annotationen über eine beliebige Eigenschaft verwenden. javadoc ist bei

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

ich persönlich die Serialisierung/Deserialisierung Technik anstatte Umwandlung bei Client-Seite verwenden würde, wie Sie es wahrscheinlich an mehreren Stellen am Ende tun.

0

Ohne Code, musste ich raten, was Sie nach Ihrer Frage tun. Dieses Tutorial JSON parse to/from using Jackson zeigt Ihnen, wie ObjectMapper zu einer Stringfiyed Darstellung von JSON zum Beispiel

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

Dann, wenn Javascript-Client empfängt diese Zeichenfolge konvertieren, werden Sie diese entweder in JSON Parse-Funktion oder jQuery bereitgestellt gebaut haben zu analysieren ein. Wie

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

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

Grund für den Versuch, sie zu analysieren parse() verwendet wird zuerst mit jQuery zu vermeiden, während es bereits eine diese in Funktion aufgebaut ist durch Browser zur Verfügung gestellt. Wenn diese Funktion jedoch nicht erkannt wird, wird sie über jQuery analysiert.

Ich hoffe, das

Für Ihr Interesse

Ihre Daten hilft Beispiel erscheint eine Art von binären Daten zu sein, und Sie versuchen, es über die Netzwerke zu senden. Dies könnte dazu führen, dass Router diese Daten filtern. Wenn Sie interessiert sind, können Sie diese Daten in Base64 kodieren, bevor Sie sie auf den Client streamen. Es ist sehr einfach zu tun, weil es bereits viele Bibliotheken gibt.

Some resources regarding to this topic.

So geht es wie

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

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

Können Sie mir bitte erklären, warum ich den Downvote erhalten habe? – Jason

1

Hinweis sein: Ich bin das EclipseLink JAXB (MOXy) Blei und Mitglied der JAXB (JSR-222) Expertengruppe.

Unten finden Sie, wie Sie diesen Anwendungsfall mit MOXy als Ihren JSON-bindenden Anbieter unterstützen können.

Java Modell

standardmäßig eine JAXB Implementierung eines byte[] zu base64Binary konvertieren. Sie können HexBinaryAdapter verwenden, um es als hexBinary darzustellen.

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

Im Demo-Code unten wir die JSON in Objekte lesen und es dann zu JSON zurückschreiben.

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

Um moxy als JAXB-Provider geben Sie eine Datei jaxb.properties im selben Paket wie Ihr Domain-Modell genannt enthalten müssen (siehe: 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

Die foo und bar Eigenschaften stellen die gleichen Daten. foo wird als base64Binary dargestellt und bar wird als hexBinary dargestellt.

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

Weitere Informationen

3

Jackson byte [] in Base64-codierte binäre Daten umwandelt. Dies ist der sichere Weg, binäre Inhalte zu übergeben. Sonst gibt es keine Möglichkeit zu wissen, welche Zeichenkodierung von enthaltenen Daten verwendet werden könnte. Der Versuch, daraus einen String zu erstellen, wäre daher riskant und fehleranfällig.

Der einfachste Weg wäre also, den Inhalt von recent base64 wieder in Binärdaten zu dekodieren.

Sie könnten auch einen benutzerdefinierten Serializer hinzufügen, um andere Darstellungen (hex, base85) zu verwenden, aber es hängt wirklich davon ab, was das Ziel ist.

Verwandte Themen