web-dev-qa-db-fra.com

Existe-t-il une bibliothèque pour convertir les POJO Java vers et à partir de JSON et XML?

J'ai un graphique d'objet que je voudrais convertir en JSON et XML, afin de créer une API de style REST. Il me semble que quelqu'un doit déjà avoir fait cela, mais une recherche rapide avec Google et Stack Overflow ne révèle rien.

Est-ce que quelqu'un connaît une bibliothèque appropriée (Apache ou une licence équivalente préférée) pour le faire?

28
Darren Hague

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

ou 

Jackson la bibliothèque utilisée au printemps: https://github.com/FasterXML/jackson

et je suis d’accord avec d’autres suggérant de jaxb pour XML à pojo, bien pris en charge de nombreux outils: c’est la norme.

12
NimChimpsky

Pour POJO to XML, je suggère d'utiliser JAXB (il existe également d'autres bibliothèques, telles que XStream par exemple, mais JAXB est normalisé).

Pour JSON, je ne sais rien, mais si vous souhaitez implémenter une API RESTful, vous pourriez être intéressé par JSR-311 qui définit une API côté serveur pour les API RESTful et Jersey , qui est son implémentation de référence.

10
Joachim Sauer

Utilisez Xstream http://x-stream.github.io/ pour xml et JSON http://www.json.org/Java/ pour JSON. Je ne pense pas qu'il y a une bibliothèque qui fait les deux.

Vous pouvez également écrire un wrapper qui délègue à des rendus XStream/JSON en fonction de vos souhaits.

6
Kannan Ekanath

Remarque: Je suis le EclipseLink JAXB (MOXy) lead et membre du JAXB (JSR-222) expert groupe.

EclipseLink JAXB (MOXy) prend en charge le mappage d'un modèle d'objet unique vers XML et JSON avec les mêmes métadonnées:

Informations sur la licence  


DOMAINE MODEL

Vous trouverez ci-dessous le modèle de domaine que nous allons utiliser pour cet exemple. Pour cet exemple, j'utilise uniquement les annotations JAXB (JSR-222) standard disponibles dans le JDK/JRE depuis Java SE 6.

Client

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;

}

PhoneNumber

package forum658936;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {

    @XmlAttribute
    int id;

    @XmlValue
    String number;

}

jaxb.properties

Pour spécifier MOXy en tant que fournisseur JAXB, vous devez inclure un fichier appelé jaxb.properties dans le même package que votre modèle de domaine avec l’entrée suivante (voir: 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

Il s'agit du code XML que notre code de démonstration lira et convertira en objets de domaine.

<?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>

Points à noter à propos du XML:


JSON

Sortie

Vous trouverez ci-dessous le JSON généré par l'exécution du code de démonstration.

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

Points à noter sur le JSON:

  • La valeur null sert à indiquer que la lastName est null. Il n'y a pas de présence de l'attribut xsi:nil.
  • La collecte des numéros de téléphone est de taille 1 et est correctement reliée par des crochets. De nombreuses bibliothèques traitent de manière incorrecte des collections de taille 1 en tant qu’objets JSON.
  • La property de type int a été correctement organisée sans guillemets.
  • Dans la représentation XML, id était un attribut, mais dans la représentation JSON, il n'est pas nécessaire qu'il soit spécialement représenté.

CODE DEMO

Dans le code de démonstration ci-dessous, nous allons convertir un document XML en objets, puis convertir ces mêmes instances en JSON.

Demo

MOXy n'interprète pas seulement les annotations JAXB, il s'agit d'une implémentation JAXB. Les API d'exécution standard JAXB sont donc utilisées. La liaison JSON est activée en spécifiant MOXy, spécifiez les propriétés sur la variable Marshaller.

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

Je pense que vous recherchez peut-être quelque chose de similaire à ce qui se trouve ici: Section Java de JSON.org

3
Mr. Will

Json-lib est sous licence Apache 2.0.

Il peut également transformer des objets JSON en XML, mais vous devrez d’abord convertir vos POJO en JSON.

1
Powerlord

Personnellement je voudrais aborder les deux séparément; et convertir JSON <-> XML via JSON <-> Pojo <-> XML.

Avec cela: Java <-> POJO avec JAXB ( http://jaxb.dev.Java.net ; également fourni avec JDK 1.6) avec des annotations (XStream est également valide); et pour JSON, ObjectMapper de Jackson ( http://jackson.codehaus.org/Tutorial ). Fonctionne bien avec Jersey et je l'utilise moi-même (la version actuelle de Jersey ne comprend pas la liaison complète des données Pojo par défaut, mais le sera dans un proche avenir)

En fait, je n’utiliserais aucune des bibliothèques xml pour produire "json": XStream et JAXB/Jettison peuvent produire une sorte de JSON, mais il utilise des conventions laides qui ne sont pas intuitives.

EDIT (18-Jul-2011): Jackson a en fait une extension appelée " jackson-xml-databind " qui peut lire/écrire du XML, similaire à JAXB. Donc, il peut être utilisé à la fois pour JSON et XML, vers/depuis les POJO.

1
StaxMan

Il y a presque littéralement des centaines. Mes favoris sont GSON pour POJO <-> JSON et castor-xml pour POJO <-> XML.

En bonus, les deux sont sous licence Apache Licence 2.0.

0
Mikkel Løkke

La dernière fois que j'ai vu sur le site Web, XStream fera les deux. Il supporte XML et JSON en tant que cibles de sérialisation. 

0
Jay R.