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?
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.
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.
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.
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:
xsi:nil
est utilisé pour indiquer que la lastName
est null.phone-number
est un type complexe avec un contenu simple (voir: http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html ).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:
null
sert à indiquer que la lastName
est null. Il n'y a pas de présence de l'attribut xsi:nil
.property
de type int
a été correctement organisée sans guillemets.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);
}
}
Je pense que vous recherchez peut-être quelque chose de similaire à ce qui se trouve ici: Section Java de JSON.org
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.
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.
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.
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.