webentwicklung-frage-antwort-db.com.de

Java 8: Wie schreibe ich einen Lambda-Stream, um mit JsonArray zu arbeiten?

Ich bin sehr neu in Java 8-Lambdas und so ... Ich möchte eine Lambda-Funktion schreiben, die einen JsonArray verwendet, seine JsonObjects durchläuft und eine Liste von Werten eines bestimmten Feldes erstellt. 

Eine Funktion, die beispielsweise den JsonArray verwendet: [{Name: "John"}, {Name: "David"}] und gibt eine Liste von ["John", "David"] zurück.

Ich habe folgenden Code geschrieben: 

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

Ich bekomme jedoch einen Fehler: 

Ausnahme im Thread "main" java.lang.NullPointerException

Wissen Sie, wie Sie das Problem lösen können? 

4
CrazySynthax

JSONArray ist eine Unterklasse von Java.util.ArrayList und JSONObject ist eine Unterklasse von Java.util.HashMap.

Daher gibt new JSONObject().put("name", "John") den vorherigen Wert zurück, der dem Schlüssel (null) zugeordnet ist, nicht die JSONObject-Instanz. Als Ergebnis wird null zur JSONArray hinzugefügt.

Dies funktioniert andererseits:

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

Aus irgendeinem Grund musste ich die Stream-Pipeline in zwei Schritte aufteilen, da der Compiler sonst nicht erkennt, dass .collect (Collectors.toList()) eine List zurückgibt.

Die Ausgabe ist:

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

Versuchen Sie es mit IntStream

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