2013-03-12 11 views
14

Es ist ziemlich einfach, ein Java-Objekt mithilfe von Marshaller in XML zu konvertieren. Aber ich muss ein Java-Objekt in JSON konvertieren, indem ich nur Marshaller verwende. Ich weiß, es ist gut, Gson oder Xstream wie Dinge zu verwenden., Aber ich muss Marshaller verwenden. Wie man es erreicht?Konvertieren von Java-Objekt in Json mit Marshaller

Vielen Dank im Voraus.

Antwort

10

Hinweis: Ich bin die EclipseLink JAXB (MOXy) Leitung und ein Mitglied der JAXB (JSR-222) Experte Gruppe,

Unten ist, wie dies getan werden kann, wenn Sie MOXy als Ihr JAXB-Anbieter verwenden.

JAVA MODEL

Kunden

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement(namespace="http://www.example.com") 
@XmlType(namespace="http://www.example.com") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Customer { 

    @XmlAttribute 
    private int id; 

    @XmlElement(namespace="http://www.example.com") 
    private String firstName; 

    @XmlElement(namespace="http://www.example.com", nillable=true) 
    private String lastName; 

    @XmlElement(namespace="http://www.example.com") 
    private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>(); 

} 

Phone

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class PhoneNumber { 

    @XmlAttribute 
    private String type; 

    @XmlValue 
    private String number; 

} 

jaxb.properties

Um moxy als JAXB-Provider geben Sie benötigen eine Datei jaxb.properties im selben Paket wie Ihr Domain-Modell mit dem folgenden Eintrag (siehe: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html) genannt sind

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

DEMO CODE

i nput.xml

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:customer xmlns:ns0="http://www.example.com" id="123"> 
    <ns0:firstName>Jane</ns0:firstName> 
    <ns0:lastName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> 
    <ns0:phoneNumbers type="work">555-1111</ns0:phoneNumbers> 
</ns0:customer> 

Demo

Im Demo-Code unten wir die gleichen JAXB Metadaten verwenden werden ein XML-Dokument in Java-Objekte zu konvertieren, und dann diese Objekte zurück zu JSON konvertieren. Mit MOXy können Sie die JSON-Ausgabe angeben, indem Sie eine Eigenschaft auf Marshaller setzen.

import java.io.File; 
import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.MarshallerProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Customer.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum15357366/input.xml"); 
     Customer customer = (Customer) unmarshaller.unmarshal(xml) 
       ; 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); 
     marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false); 
     marshaller.marshal(customer, System.out); 
    } 

} 

JSON Ausgabe

Unten ist der Ausgang JSON. Beachten Sie, dass keine Indikatoren für Namespaces oder XML-Attribute vorhanden sind. Beachten Sie auch, dass die Sammlung der Größe Eins korrekt als JSON-Array dargestellt wurde (ein Problem mit einigen anderen Ansätzen).

{ 
    "id" : 123, 
    "firstName" : "Jane", 
    "lastName" : null, 
    "phoneNumbers" : [ { 
     "type" : "work", 
     "value" : "555-1111" 
    } ] 
} 
+0

@BDoughan: Ja, ich habe das auch in Ihrem Blog gesehen. Aber ich bekomme ClassNotFound Exception auf JAXBContextFactory.Ich habe die jaxb.properties enthalten und ich auch eine Abhängigkeit in pom.xml. Bitte leiten Sie mich für die richtige Abhängigkeit für diese Klasse – Arun

+0

@ user1933756 - Hier ist eine 'pom.xml' aus einem Beispiel, das ich auf GitHub gehostet habe, die Sie als Leitfaden verwenden können: https://github.com/bdoughan/blog20110819 /blob/master/pom.xml –

+1

Vielen Dank Doughan :) funktioniert super !!! – Arun

0

JsonMarshaller ist eine Java 1.5-Bibliothek, die das Marshalling und das Unmarshalling von JSON-Objekten zu und von Java-Objekten ermöglicht. Das Ziel dieses Projekts ist vor allem einfache Handhabung, Transparenz und statische Sicherheit. Beispiel

Wenn Sie die folgende Java-Klasse:

JAVA:

@Entity 
class Book { 
@Value 
    private String title; 
@Value 
    private String isbn; 
@Value 
    private Set<author> authors; 
} 

@Entity 
class Author { 
@Value 
    private String firstName; 
@Value 
    private String lastName; 
} 

und erstellt ein neues Buch() und mit Informationen bestückt könnte es Marshal:

JSON: 

{title: "java", 
isbn: "122333", 
authors: [{firstName: "Herbert", lastName: "Shield"}, 
      {firstName: "Pascal", lastName: "Perez"}]} 
+1

Thnksfor ur Antwort. Aber ich muss wissen, wie Sie das JSON von der oben genannten Klasse bekommen. – Arun

+1

Werfen Sie einen Blick auf die Dokumentation unter https://code.google.com/p/jsonmarshaller/wiki/Einleitung –