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?
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"}]
Essayez avec IntStream
> List<String> jsonObject = IntStream
> .range(0,jsonArray.length())
> .mapToObj(i -> jsonArray.getJSONObject(i))
> .collect(Collectors.toList());