2012-06-12 24 views
5

Sono molto nuovo a Json e il mio obiettivo è creare l'output Json sotto dal bean Java. Come dovrei strutturare il mio oggetto Java? Devo avere la classe MyResult e Utente e Risultato come sottoclassi? Quale libreria Json posso usare per questo?Json - Java Object to Json

“MyResult” { 
    “AccountID”: “12345”, 
    "User" { 
     "Name": "blah blah", 
     "Email": “[email protected]”, 
    }, 
    "Result" { 
     "Course": “blah”, 
     "Score": “10.0” 
    } 
} 
+0

Grazie per la risposta. Se dovessi progettare questo in Jackson, come dovrebbe essere il mio oggetto Java? – user238021

risposta

9

Nota: Sono in vantaggio EclipseLink JAXB (MOXy) e un membro del gruppo di esperti JAXB (JSR-222).


Come dovrei strutturare il mio oggetto Java?

Di seguito è possibile visualizzare il modello dell'oggetto. Il binding JSON di MOXy sfrutta le annotazioni JAXB per mappare il modello di dominio a JSON, quindi ho incluso anche quelle. Le implementazioni JAXB hanno regole predefinite per la mappatura dei nomi di campi/proprietà, ma poiché il documento differisce da quello predefinito, ogni campo doveva essere annotato.

MyResult

package forum11001458; 

import javax.xml.bind.annotation.*; 

@XmlRootElement(name="MyResult") 
public class MyResult { 

    @XmlElement(name="AccountID") 
    private String accountID; 

    @XmlElement(name="User") 
    private User user; 

    @XmlElement(name="Result") 
    private Result result; 

} 

utente

package forum11001458; 

import javax.xml.bind.annotation.XmlElement; 

public class User { 

    @XmlElement(name="Name") 
    private String name; 

    @XmlElement(name="Email") 
    private String email; 

} 

Risultato

package forum11001458; 

import javax.xml.bind.annotation.XmlElement; 

public class Result { 

    @XmlElement(name="Course") 
    private String course; 

    @XmlElement(name="Score") 
    private String score; 

} 

Quale libreria Json posso utilizzare per questo?

Qui di seguito è come è possibile utilizzare Moxy per fare il binding JSON:

JAXB.proprietà

Per utilizzare moxy come provider JAXB è necessario includere un file chiamato jaxb.properties con la seguente voce nello stesso pacchetto come il modello di dominio:

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

Demo

Si noti come L'associazione JSON di MOXy non richiede alcuna dipendenza dal tempo di compilazione. Tutte le API necessarie sono disponibili in Java SE 6. È possibile aggiungere le API di supporto necessarie se si utilizza Java SE 5.

package forum11001458; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(MyResult.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     unmarshaller.setProperty("eclipselink.media-type", "application/json"); 
     File json = new File("src/forum11001458/input.json"); 
     Object myResult = unmarshaller.unmarshal(json); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty("eclipselink.media-type", "application/json"); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(myResult, System.out); 
    } 

} 

input.json/Output

{ 
    "MyResult" : { 
     "AccountID" : "12345", 
     "User" : { 
     "Name" : "blah blah", 
     "Email" : "[email protected]" 
     }, 
     "Result" : { 
     "Course" : "blah", 
     "Score" : "10.0" 
     } 
    } 
} 
7

Googles GSON è davvero un bel lib JSON. This proviene dal collegamento precedente e in sostanza delinea alcune delle sue funzionalità.

5

jackson è anche abbastanza veloce e facile da usare

+0

Grazie per la risposta. Se dovessi progettare questo in Jackson, come dovrebbe essere il mio oggetto Java? – user238021

1

Anche se chiuso, this SO post può aiutare a capire le differenze tra Jackson e GSON. Quale è "migliore" dipende da ciò che è importante per te.

MODIFICA: in particolare per Jackson, il tuo esempio assomiglia molto all'esempio che danno per quello che chiamano Full Data Binding, puoi leggerlo here. Btw, anche se gli annunciati 5 minuti necessari per leggere quel documento è forse un po 'breve, offre una panoramica completa dei diversi modi in cui Jackson può essere utilizzato. Noterai inoltre che gli esempi forniti non utilizzano annotazioni.

1

O GSON

Super facile (non getter/settres, senza annotazioni o configurazioni necessarie).

class BagOfPrimitives { 
    private int value1 = 1; 
    private String value2 = "abc"; 
    private transient int value3 = 3; 
} 

BagOfPrimitives obj = new BagOfPrimitives(); 
Gson gson = new Gson(); 
String json = gson.toJson(obj); 

==> json is {"value1":1,"value2":"abc"} 
+0

Vedo ora, @fvu ha detto la stessa cosa. Comunque. – ses