it-swarm.com.de

Gibt es eine Bibliothek, um Java POJOs in und aus JSON und XML zu konvertieren?

Ich habe ein Objektdiagramm, das ich zu und von JSON und XML konvertieren möchte, um eine API im REST-Stil zu erstellen. Es fällt mir auf, dass dies bereits jemand getan haben muss, aber eine schnelle Suche mit Google und Stack Overflow zeigt nichts.

Kennt jemand eine geeignete Bibliothek (Apache oder gleichwertige Lizenz bevorzugt), um dies zu tun?

28
Darren Hague

GSONvon google: http://code.google.com/p/google-gson/ ,

oder 

Jackson die im Frühling verwendete Bibliothek: https://github.com/FasterXML/jackson

und ich würde mit anderen übereinstimmen, die jaxb für XML für pojo vorschlagen, wobei viele Werkzeuge gut unterstützt werden: es ist der Standard.

12
NimChimpsky

Für POJO to XML empfehle ich die Verwendung von JAXB (es gibt auch andere Bibliotheken, wie zum Beispiel XStream, aber JAXB ist standardisiert).

Für JSON weiß ich nichts, aber wenn Sie eine RESTful-API implementieren möchten, interessieren Sie sich möglicherweise für JSR-311 , das eine serverseitige API für RESTful-APIs und Jersey definiert seine Referenzimplementierung.

10
Joachim Sauer

Verwenden Sie Xstream http://x-stream.github.io/ für XML und JSON http://www.json.org/Java/ für JSON. Ich glaube nicht, dass es eine Bibliothek gibt, die beides tut.

Oder schreiben Sie einen Wrapper, der je nach Wunsch an XStream-Renderer/JSON-Renderer delegiert.

6
Kannan Ekanath

Hinweis: Ich bin der EclipseLink JAXB (MOXy) Lead und ein Mitglied des JAXB (JSR-222) expert Gruppe.

EclipseLink JAXB (MOXy) unterstützt das Zuordnen eines einzelnen Objektmodells zu XML und JSON mit denselben Metadaten:

Lizenzinformationen  


DOMAIN MODELL

Nachfolgend finden Sie das Domänenmodell, das wir für dieses Beispiel verwenden werden. Für dieses Beispiel verwende ich nur die Standard-JAXB-Annotationen (JSR-222), die seit JDK/JRE seit Java SE 6 verfügbar sind.

Kunde

package forum658936;

import Java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    String firstName;

    @XmlElement(nillable=true)
    String lastName;

    @XmlElement(name="phone-number")
    List<PhoneNumber> phoneNumbers;

}

Telefonnummer

package forum658936;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {

    @XmlAttribute
    int id;

    @XmlValue
    String number;

}

jaxb.properties

Um MOXy als JAXB-Provider anzugeben, müssen Sie eine Datei mit dem Namen jaxb.properties in demselben Paket wie Ihr Domänenmodell mit folgendem Eintrag angeben (siehe: http://blog.bdoughan.com/2011/05/specifying-eclipselink- moxy-as-your.html ).

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

XML

input.xml

Dies ist das XML, das unser Demo-Code einliest und in Domänenobjekte konvertiert.

<?xml version="1.0" encoding="UTF-8"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <firstName>Jane</firstName>
    <lastName xsi:nil="true"/>
    <phone-number id="123">555-1234</phone-number>
</customer>

Dinge, die Sie zu XML beachten sollten:


JSON

Ausgabe

Unten ist der JSON-Code, der durch Ausführen des Demo-Codes ausgegeben wurde.

{
   "firstName" : "Jane",
   "lastName" : null,
   "phone-number" : [ {
      "id" : 123,
      "value" : "555-1234"
   } ]
}

Dinge, die Sie beim JSON beachten sollten:

  • Der null-Wert wird verwendet, um anzuzeigen, dass die lastName null ist. Das xsi:nil-Attribut ist nicht vorhanden.
  • Die Anzahl der Telefonnummern hat die Größe 1 und ist korrekt mit eckigen Klammern verbunden. Viele Bibliotheken behandeln Sammlungen der Größe 1 falsch als JSON-Objekte.
  • Die Variable property des Typs int wurde ohne Anführungszeichen richtig gerendert.
  • In der XML-Repräsentation war id ein Attribut, in der JSON-Repräsentation muss sie jedoch nicht besonders dargestellt werden.

DEMO CODE

Im folgenden Demo-Code konvertieren wir ein XML-Dokument in Objekte und dann diese Instanzen in JSON.

Demo

MOXy interpretiert nicht nur JAXB-Anmerkungen, sondern ist eine JAXB-Implementierung. Daher werden die standardmäßigen JAXB-Laufzeit-APIs verwendet. Die JSON-Bindung wird durch Angabe von MOXy-Eigenschaften für Marshaller aktiviert.

package forum658936;

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/forum658936/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);
    }

}
3
Blaise Doughan

Ich denke, Sie suchen vielleicht nach etwas ähnlichem, was hier ist: JSON.org Java section

3
Mr. Will

Json-lib steht unter der Apache 2.0-Lizenz.

Es kann auch JSON-Objekte in XML umwandeln, aber Sie müssen zuerst Ihre POJOs in JSON konvertieren.

1
Powerlord

Ich persönlich würde die beiden getrennt angehen; und JSON <-> XML über JSON <-> Pojo <-> XML zu konvertieren.

Mit diesem: Java <-> POJO mit JAXB ( http://jaxb.dev.Java.net ; ebenfalls mit JDK 1.6 gebündelt) mit Anmerkungen (XStream ist auch in Ordnung); und für JSON Jackson's ObjectMapper ( http://jackson.codehaus.org/Tutorial ). Funktioniert gut mit Jersey, und ich verwende es selbst (die aktuelle Jersey-Version enthält standardmäßig keine vollständige Pojo-Datenbindung, wird es aber in naher Zukunft tun)

Ich würde eigentlich keine XML-Libs verwenden, um "Json" zu erzeugen: XStream und JAXB/Jettison können eine Art JSON erzeugen, aber es verwendet hässliche Konventionen, die eher nicht intuitiv sind.

EDIT (18-Jul-2011): Jackson hat tatsächlich eine Erweiterung namens " jackson-xml-databind ", die XML lesen/schreiben kann, ähnlich wie bei JAXB. Es kann also sowohl für JSON als auch für XML von/nach POJOs verwendet werden.

1
StaxMan

Es gibt fast buchstäblich Hunderte. Meine Favoriten sind GSON für POJO <-> JSON und castor-xml für POJO <-> XML.

Als Bonus sind beide unter Apache License 2.0-Lizenzen lizenziert.

0
Mikkel Løkke

Zuletzt habe ich auf der Website XStream gesehen. Es unterstützt XML und JSON als Serialisierungsziele. 

0
Jay R.