Il est assez facile de convertir un objet Java en XML à l'aide de Marshaller. Mais je dois convertir un objet Java en JSON en utilisant marshaller seul. Je connais son bon d'utiliser gson ou Xstream comme des choses., mais je dois faire en utilisant Marshaller. Comment y parvenir?
Merci d'avance.
Remarque: Je suis le EclipseLink JAXB (MOXy) chef de file et membre du groupe d'experts JAXB (JSR-222) ,
Voici comment cela peut être fait si vous utilisez MOXy comme fournisseur JAXB.
MODÈLE Java
Client
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>();
}
Numéro de téléphone
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {
@XmlAttribute
private String type;
@XmlValue
private String number;
}
jaxb.properties
Pour spécifier MOXy comme 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
CODE DEMO
input.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>
Démo
Dans le code de démonstration ci-dessous, nous utiliserons les mêmes métadonnées JAXB pour convertir un document XML en objets Java, puis reconvertir ces objets en JSON. Avec MOXy, vous pouvez spécifier la sortie JSON en définissant une propriété sur le Marshaller
.
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);
}
}
Sortie JSON
Voici la sortie JSON. Notez qu'il n'y a aucun indicateur correspondant aux espaces de noms ou aux attributs XML. Notez également que la collection de taille 1 était correctement représentée comme un tableau JSON (un problème avec certaines autres approches).
{
"id" : 123,
"firstName" : "Jane",
"lastName" : null,
"phoneNumbers" : [ {
"type" : "work",
"value" : "555-1111"
} ]
}
JsonMarshaller est une bibliothèque Java 1.5 qui permet le marshaling et le démarshalling d'objets JSON vers et depuis Java objets. Le but de ce projet est avant tout la facilité d'utilisation, la transparence et sécurité de type statique.
Si vous avez la classe Java Java suivante:
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;
}
et vous avez créé un nouveau livre () et l'avez rempli avec des informations qu'il pourrait également rassembler:
JSON:
{title: "Java",
isbn: "122333",
authors: [{firstName: "Herbert", lastName: "Shield"},
{firstName: "Pascal", lastName: "Perez"}]}