web-dev-qa-db-fra.com

Java 8: Comment écrire un flux lambda pour travailler avec JsonArray?

Je suis très nouveau dans Java 8 lambdas et d'autres choses ... Je veux écrire une fonction lambda qui prend un JsonArray, passe en revue ses JsonObjects et crée une liste de valeurs de certains champs. 

Par exemple, une fonction qui prend le JsonArray: [{name: "John"}, {name: "David"}] et retourne une liste de ["John", "David"].

J'ai écrit le code suivant: 

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class Main {
    public static void main(String[] args) {
        JSONArray jsonArray = new JSONArray();
        jsonArray.add(new JSONObject().put("name", "John"));
        jsonArray.add(new JSONObject().put("name", "David"));
        List list = (List) jsonArray.stream().map(json -> json.toString()).collect(Collectors.toList());
        System.out.println(list);
    }
}

Cependant, j'obtiens une erreur: 

Exception dans le fil "principal" Java.lang.NullPointerException

Savez-vous comment le résoudre? 

4
CrazySynthax

JSONArray est une sous-classe de Java.util.ArrayList et JSONObject est une sous-classe de Java.util.HashMap.

Par conséquent, new JSONObject().put("name", "John") renvoie la valeur précédente associée à la clé (null) et non l'instance JSONObject. Par conséquent, null est ajouté à JSONArray.

Ceci, en revanche, fonctionne:

    JSONArray jsonArray = new JSONArray();
    JSONObject j1 = new JSONObject();
    j1.put ("name", "John");
    JSONObject j2 = new JSONObject();
    j2.put ("name", "David");
    jsonArray.add(j1);
    jsonArray.add(j2);
    Stream<String> ss = jsonArray.stream().map (json->json.toString ());
    List<String> list = ss.collect (Collectors.toList ());
    System.out.println(list);

Pour une raison quelconque, j'ai dû diviser le pipeline de flux en deux étapes, car sinon le compilateur ne reconnaît pas que .collect (Collectors.toList()) renvoie une List.

La sortie est:

[{"name":"John"}, {"name":"David"}]
4
Eran

Essayez avec IntStream

> List<String> jsonObject = IntStream
>      .range(0,jsonArray.length())
>      .mapToObj(i -> jsonArray.getJSONObject(i))
>      .collect(Collectors.toList());
0
Adrian