Jackson-best way escribe una lista java en una matriz json


Quiero usar Jackson para convertir una ArrayList a JSONArray.

Evento.java : esta es la clase java bean con dos campos "field1", "field2" mapeados como JsonProperty.

Mi objetivo es:

Convertir

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

A

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

La forma en que puedo pensar es: 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());
}

Estoy buscando algo como:

generator.write(out, list)  

Esto convierte directamente la lista al formato de matriz json y luego la escribe en outputstream "fuera".

Aún más codicioso:

generator.write(out, list1)

generator.write(out, list2)

Esto solo convertirá/agregará en list1, list2 en una sola matriz json. luego escríbelo a"out"

Author: Shengjie, 2012-11-22

3 answers

Esto es demasiado complicado, Jackson maneja listas a través de sus métodos de escritor tan bien como maneja objetos regulares. Esto debería funcionar bien para usted, asumiendo que no he entendido mal su pregunta:

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));
}
 44
Author: Perception,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-03 20:52:44

No puedo encontrar toByteArray() como dijo @atrioom, así que uso StringWriter, por favor intente:

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

O simplemente use ObjectMapper#writeValueAsString:

    final ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(list));
 18
Author: Jaskey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-11 10:05:19

En ObjectMapper tenemos writevaluueasstring() que acepta object como parámetro. Podemos pasar la lista de objetos como parámetro get the string back.

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)
 9
Author: user3804309,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-04 16:55:19