web-dev-qa-db-fra.com

Conversion de Java Object en Json à l'aide de Marshaller

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.

18
Arun

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"
   } ]
}
11
bdoughan

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"}]}
0
Biswajit