web-dev-qa-db-fra.com

Jackson - le meilleur moyen d'écrire une liste Java dans un tableau json

Je veux utiliser jackson pour convertir un ArrayList en un JsonArray.

Event.Java: il s'agit de la classe de beans Java) avec deux champs "champ1", "champ2" mappés en tant que JsonProperty.

Mon but est:

Convertir

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

À

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

La façon dont je peux penser est la suivante: 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());
}

Je cherche quelque chose comme:

generator.write(out, list)  

ceci convertit directement la liste au format tableau JSON, puis l’écrit dans le flux de sortie "out".

encore plus gourmand:

generator.write(out, list1)

generator.write(out, list2)

cela convertira/ajoutera dans list1, list2 en un seul tableau json. puis écrivez à "out"

48
Shengjie

C'est trop compliqué, Jackson gère les listes via ses méthodes d'écriture aussi bien que les objets ordinaires. Cela devrait bien fonctionner pour vous, en supposant que je n'ai pas mal compris votre question:

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));
}
55
Perception

Je ne trouve pas toByteArray() comme @atrioom a dit, alors j'utilise StringWriter, veuillez essayer:

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

Ou utilisez simplement ObjectMapper#writeValueAsString:

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

Dans objectMapper, nous avons writeValueAsString () qui accepte un objet en tant que paramètre. Nous pouvons passer la liste d'objets en tant que paramètre récupère la chaîne.

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
user3804309