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"
} ]
}
@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
@ 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 –
Vielen Dank Doughan :) funktioniert super !!! – Arun