2012-11-22 6 views
34

Voglio usare jackson per convertire un ArrayList in un JsonArray.Jackson - il modo migliore scrive un elenco java su un array json

Event.java: questa è la classe java bean con due campi "campo1", "campo2" mappati come JsonProperty.

Il mio obiettivo è:

Convert

ArrayList<Event> list = new ArrayList<Event>(); 
    list.add(new Event("a1","a2")); 
    list.add(new Event("b1","b2")); 

Per

[ 
{"field1":"a1", "field":"a2"}, 
{"field1":"b1", "field":"b2"} 
] 

Il modo in cui mi viene in mente è: writeListToJsonArray():

public void writeListToJsonArray() throws IOException { 
    ArrayList<Event> list = new ArrayList<Event>(); 
    list.add(new Event("a1","a2")); 
    list.add(new Event("b1","b2")); 

    OutputStream out = new ByteArrayOutputStream(); 

    JsonFactory jfactory = new JsonFactory(); 
    JsonGenerator jGenerator = jfactory.createJsonGenerator(out, JsonEncoding.UTF8); 
    ObjectMapper mapper = new ObjectMapper(); 
    jGenerator.writeStartArray(); // [ 

    for (Event event : list) { 
     String e = mapper.writeValueAsString(event); 
     jGenerator.writeRaw(usage); 
     // here, big hassles to write a comma to separate json objects, when the last object in the list is reached, no comma 
    } 

    jGenerator.writeEndArray(); // ] 

    jGenerator.close(); 

    System.out.println(out.toString()); 
} 

Sto cercando qualcosa di simile:

generator.write(out, list) 

questo convertire direttamente la lista di formato di array JSON e poi scrivere a OutputStream "out".

ancora più avido:

generator.write(out, list1) 

generator.write(out, list2) 

questo sarà solo convertire/aggiungere nella Lista1, Lista2 in un singolo array JSON. quindi scriverlo su "out"

+2

Hai provato 'mapper.writeValueAsString (list)'? O 'mapper.writeValue (out, list)'. –

+0

sì, alla fine mapper.writeValueAsString (lista) fa il trucco, ma il mio caso vuole scrivere più elenchi in un unico JsonArray. Qualche idea? – Shengjie

+0

Se ho capito bene, puoi creare un nuovo elenco e aggiungere tutti gli elenchi a uno nuovo e convertirlo è quello di JSON. –

risposta

37

Ciò è eccessivamente complicato, Jackson gestisce gli elenchi tramite i suoi metodi di scrittura così come gestisce oggetti regolari. Questo dovrebbe funzionare bene per te, supponendo che non ho capito male la tua domanda:

public void writeListToJsonArray() throws IOException { 
    final List<Event> list = new ArrayList<Event>(2); 
    list.add(new Event("a1","a2")); 
    list.add(new Event("b1","b2")); 

    final ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    final ObjectMapper mapper = new ObjectMapper(); 

    mapper.writeValue(out, list); 

    final byte[] data = out.toByteArray(); 
    System.out.println(new String(data)); 
} 
+0

sì, funziona, grazie :) Credo che il mio problema sia più nell'aggiungere più elenchi a un singolo jsonArray, mapper.writeValue (out, list1) mapper.writeValue (out, list2) .... mapper.writeValue (out, listn) sta scrivendo la lista come array json separato, hai capito? Fondamentalmente ho liste in entrata, voglio aggiungerle in un singolo jsonarray. – Shengjie

+2

Non è possibile scrivere più elenchi back to back senza che vengano taggati come proprietà, che non sarebbe JSON valido. – Perception

+0

è possibile scrivere più array se sono avvolti in un array –

18

non riesco a trovare toByteArray() come ha detto @atrioom, per cui uso StringWriter, riprova:

public void writeListToJsonArray() throws IOException { 

    //your list 
    final List<Event> list = new ArrayList<Event>(2); 
    list.add(new Event("a1","a2")); 
    list.add(new Event("b1","b2")); 


    final StringWriter sw =new StringWriter(); 
    final ObjectMapper mapper = new ObjectMapper(); 
    mapper.writeValue(sw, list); 
    System.out.println(sw.toString());//use toString() to convert to JSON 

    sw.close(); 
} 

Or basta usare ObjectMapper#writeValueAsString:

final ObjectMapper mapper = new ObjectMapper(); 
    System.out.println(mapper.writeValueAsString(list)); 
7

In ObjectMapper abbiamo writeValueAsString(), che accetta oggetto come parametro. Possiamo passare l'elenco degli oggetti come parametro recuperare la stringa.

List<Apartment> aptList = new ArrayList<Apartment>(); 
    Apartment aptmt = null; 
    for(int i=0;i<5;i++){ 
     aptmt= new Apartment(); 
     aptmt.setAptName("Apartment Name : ArrowHead Ranch"); 
     aptmt.setAptNum("3153"+i); 
     aptmt.setPhase((i+1)); 
     aptmt.setFloorLevel(i+2); 
     aptList.add(aptmt); 
    } 
mapper.writeValueAsString(aptList) 
Problemi correlati