2013-03-12 12 views
14

È piuttosto semplice convertire un oggetto java in XML utilizzando Marshaller. Ma ho bisogno di convertire un oggetto java in JSON usando solo il marshaller. So che è bello usare gson o cose simili a Xstream., Ma ho bisogno di usare Marshaller. Come raggiungerlo?Conversione di oggetti Java in Json utilizzando Marshaller

Grazie in anticipo.

risposta

10

Nota: Sono il lead EclipseLink JAXB (MOXy) e un membro dell'esperto JAXB (JSR-222) group,

Segue come è possibile farlo se si utilizza MOXy come provider JAXB.

JAVA MODELLO

clienti

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>(); 

} 

PhoneNumber

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class PhoneNumber { 

    @XmlAttribute 
    private String type; 

    @XmlValue 
    private String number; 

} 

jaxb.properties

Per specificare moxy come provider JAXB è necessario includere un file chiamato jaxb.properties nello stesso pacchetto come il modello di dominio con la seguente voce (vedi: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)

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

CODICE DEMO

i nput.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> 

Demo

Nel codice demo di seguito useremo gli stessi metadati JAXB per convertire un documento XML in oggetti Java e quindi convertire gli oggetti di nuovo a JSON. Con MOXy è possibile specificare l'output JSON impostando una proprietà su 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); 
    } 

} 

JSON uscita

Sotto è l'uscita JSON. Nota come non ci sono indicatori corrispondenti a namespace o attributi XML. Si noti inoltre che la raccolta della dimensione uno è stata correttamente rappresentata come una matrice JSON (un problema con altri approcci).

{ 
    "id" : 123, 
    "firstName" : "Jane", 
    "lastName" : null, 
    "phoneNumbers" : [ { 
     "type" : "work", 
     "value" : "555-1111" 
    } ] 
} 
+0

@BDoughan: Sì, l'ho visto anche nel tuo blog. Ma sto ottenendo ClassNotFound Exception su JAXBContextFactory.Io ho incluso jaxb.properties e ho inserito anche una dipendenza in pom.xml. cortesemente guidami per la corretta dipendenza per quella classe – Arun

+0

@ user1933756 - Ecco un 'pom.xml' da un esempio che ho ospitato su GitHub che puoi usare come guida: https://github.com/bdoughan/blog20110819 /blob/master/pom.xml –

+1

Grazie mille Doughan :) funziona alla grande !!! – Arun

0

JsonMarshaller è una libreria Java 1.5 che consente il marshalling e lo smantellamento di oggetti JSON da e verso oggetti Java. L'obiettivo di questo progetto è soprattutto la facilità d'uso, la trasparenza e la sicurezza del tipo statico. Esempio

Se si dispone la seguente classe Java:

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; 
} 

ed è stato creato un nuovo libro() e popolata con informazioni potrebbe schierare troppo:

JSON: 

{title: "java", 
isbn: "122333", 
authors: [{firstName: "Herbert", lastName: "Shield"}, 
      {firstName: "Pascal", lastName: "Perez"}]} 
+1

Per la risposta. Ma ho bisogno di sapere come si ottiene quel JSON dalla classe di cui sopra. – Arun

+1

Dai un'occhiata alla documentazione all'indirizzo https://code.google.com/p/jsonmarshaller/wiki/Introduction –

Problemi correlati