2012-08-23 18 views
9

Cerchiamo un modo (forse framework esistente o simile) per generare frammenti JSON di esempio basati su POJO (sorgente o binario). Per esempio:Genera campione JSON da POJO

public class foo { 
    String var1; 
    String var2; 

    public String getVar1() { return var1; } 
    public void setVar1(String var1) { this.var1 = var1; } 

    public String getVar2() { return var2; } 
    public void setVar2(String var2) { this.var2 = var2; } 
} 

sarebbe cedere un campione JSON che potrebbe apparire come:

{ 
    "var1": "string1", 
    "var2": "string2" 
} 

tutte le idee? Potremmo ovviamente indicarlo a mano. Sto solo cercando di vedere se c'è già qualcosa là fuori.

risposta

4

Si potrebbe anche dare un'occhiata a Gson (si legge direttamente/scrive i campi, senza bisogno di getter/setter):

Foo foo = ... 
Gson gson = new Gson(); 
String json = gson.toJson(foo); 

Fatevi un favore e non digitate manualmente JSON (o XML, o qualsiasi formato di dati strutturato se potete evitarlo). Reinventa inutilmente la ruota. Qualcuno lo ha già fatto e ha già risolto la fuga, l'annidamento e tutti i tipi di casi di confine per te.

2

Utilizzando GSON:

Foo foo = new Foo(); 
foo.setVar1("string1"); 
foo.setVar2("string2"); 

Gson gson = new Gson();  
String json = gson.toJson(foo); 
4

C'è anche un altro libreria chiamata Genson http://code.google.com/p/genson/.

In realtà Genson è più veloce e ha più funzioni di Gson e ha prestazioni vicino a Jackson (ma è molto più leggero) vedere http://code.google.com/p/genson/wiki/Metrics. Utilizza l'API di streaming anziché un modello dom che offre una migliore scalabilità ed è utile nelle applicazioni Web in cui è possibile gestire la conversione man mano che l'input arriva.

Genson è adatto per tutti i tipi di casi d'uso, dalla semplice conversione, alla completa personalizzazione di tutto il processo. È possibile configurare molte cose (utilizzare campi e/o metodi, utilizzare il costruttore con argomenti e senza annotazioni, filtrare le proprietà in base alla visibilità e molto altro). Dovresti dare un'occhiata al wiki.

La sua ultima versione (0.91) è disponibile nel repository centrale di Maven.

<dependency> 
    <groupId>com.owlike</groupId> 
    <artifactId>genson</artifactId> 
    <version>0.91</version> 
</dependency> 

Disclaimer: Sono l'autore della biblioteca, ma cerco di essere obiettivo (soprattutto nei parametri di riferimento).

Modifica Alcune parole su Gson e Jackson. Ho usato Jackson per più di 2 anni e un po 'di Gson. La prima cosa da notare è che Jackson è la libreria json/java più veloce là fuori (Gesnon cerca di batterlo ma è piuttosto difficile). Jackson ha anche molte caratteristiche e possibilità di configurazione (la maggior parte basata su annotazioni). Avevo un uso standard e avanzato di Jackson, ed è stato bello fino a quando non avevo bisogno di funzioni che Jackson non aveva fornito. Ho scoperto che la libreria era davvero difficile da estendere (per i miei casi d'uso era impossibile senza riscrivere una grande parte).

Ho quindi provato Gson. La prima cosa da notare su Gson è che non usa getter/setter ma solo i campi! Le sue prestazioni non erano buone (specialmente rispetto a Jackson o Genson). Con le ultime versioni è migliorato in quanto forniscono anche uno streaming API, ma non è ancora abbastanza veloce.All'inizio il suo principale vantaggio era il buon supporto dei generici di Java, ma Jackson e Genson lo forniscono anche. Nota anche che Gson ha meno funzioni fuori dalla scatola di Genson o Jackson. Ho anche provato ad implementare le funzionalità di cui avevo bisogno in Gson, ma ho scoperto che la parte del database Beans non era estendibile (vicino a tutto in una singola classe senza punti di estensione), quindi dovrei riscriverlo. Era fuori discussione e questo è il modo in cui sono finito con la creazione di Genson.

Se non vuoi usare Genson, ti consiglio vivamente Jackson per Gson.

2

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

È possibile utilizzare EclipseLink JAXB (MOXy) per convertire il modello dell'oggetto in JSON (e/o XML). Di seguito è riportato un esempio completo.

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 

Dimostrazione

Il codice demo qui sotto possono essere utilizzate per produrre l'output JSON da un'istanza di foo. Nota come vengono utilizzate solo le API JAXB standard. Le API JAXB sono stati nel JDK/RE dal Java SE 6.

package forum12101023; 

import javax.xml.bind.*; 

public class Demo { 

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

     foo foo = new foo(); 
     foo.setVar1("string1"); 
     foo.setVar2("string2"); 

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

} 

uscita

{ 
    "var1" : "string1", 
    "var2" : "string2" 
} 

Per ulteriori informazioni

0

Puoi usare Gson per farlo.

Gson gson = new Gson(); 
String fooJSON= gson.toJson(foo); 

Controllare this link per una spiegazione dettagliata anche come farlo in JS/ExtJS e anche deserializzazione da JSON per POJO

Problemi correlati