Analysieren des JSON-Arrays in java.util.List mit Gson

119

Ich habe einen JsonObjectNamen "mapping"mit folgendem Inhalt:

{
    "client": "127.0.0.1",
    "servers": [
        "8.8.8.8",
        "8.8.4.4",
        "156.154.70.1",
        "156.154.71.1"
    ]
}

Ich weiß, dass ich das Array bekommen kann "servers"mit:

mapping.get("servers").getAsJsonArray()

Und jetzt möchte ich das JsonArrayin eine java.util.List...

Was ist der einfachste Weg, dies zu tun?

Abel Callejo
quelle
2
@ruakh Es gibt viele Unterschiede zwischen dieser und dieser Frage. Dieser befasst sich mit Gson.
Abel Callejo
@AbelMelquiadesCallejo werfen Sie einen Blick auf die Antwort. Ich hoffe, es wird Ihr Problem lösen.
Prateek
@ruakh ja ich stimme dir zu und ich kenne JsonArrayGeräte Iterable. Es ist nur so, dass ich auch andere Wege finde, als eine neue Bibliothek hinzuzufügen.
Abel Callejo

Antworten:

272

Der einfachste Weg, dies zu tun, ist definitiv die Verwendung der Standard-Parsing-Funktion von Gson fromJson().

Es gibt eine Implementierung dieser Funktion, die geeignet ist, wenn Sie in eine beliebige ParameterizedType(z. B. eine beliebige List) deserialisieren müssen fromJson(JsonElement json, Type typeOfT).

In Ihrem Fall müssen Sie nur das Typevon a List<String>abrufen und dann das JSON-Array Typewie folgt analysieren :

import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() {}.getType();

List<String> yourList = new Gson().fromJson(yourJson, listType);

In Ihrem Fall yourJsonist ein JsonElement, aber es könnte auch ein String, irgendein Readeroder ein sein JsonReader.

Vielleicht möchten Sie einen Blick auf die Gson API-Dokumentation werfen .

MikO
quelle
7
Typekann in welchem ​​Paket gefunden werden?
Abel Callejo
10
Typeist eine in Java integrierte Schnittstelle im Paketjava.lang.reflect
MikO
Ich hatte zu verwenden , getString()statt get()sonst .fromJson()beschwert.
Lenooh
@MikO Ich habe eine ähnliche Frage mit Gson hier . Ich wollte sehen, ob Sie mir helfen können. Ich habe eine Lösung, aber das Problem ist, dass es sehr chaotisch aussieht, nur einen JSON in eine Map zu analysieren.
John
18

Der folgende Code wird verwendet com.google.gson.JsonArray. Ich habe die Anzahl der Elemente in der Liste sowie die Elemente in der Liste gedruckt

import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;


public class Test {

    static String str = "{ "+ 
            "\"client\":\"127.0.0.1\"," + 
            "\"servers\":[" + 
            "    \"8.8.8.8\"," + 
            "    \"8.8.4.4\"," + 
            "    \"156.154.70.1\"," + 
            "    \"156.154.71.1\" " + 
            "    ]" + 
            "}";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {

            JsonParser jsonParser = new JsonParser();
            JsonObject jo = (JsonObject)jsonParser.parse(str);
            JsonArray jsonArr = jo.getAsJsonArray("servers");
            //jsonArr.
            Gson googleJson = new Gson();
            ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
            System.out.println("List size is : "+jsonObjList.size());
                    System.out.println("List Elements are  : "+jsonObjList.toString());


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

AUSGABE

List size is : 4

List Elements are  : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]
Prateek
quelle
8

Ich habe die Lösung von der offiziellen Website von Gson hier gelesen

Und dieser Code für Sie:

    String json = "{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}";

    JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
    JsonArray jsonArray = jsonObject.getAsJsonArray("servers");

    String[] arrName = new Gson().fromJson(jsonArray, String[].class);

    List<String> lstName = new ArrayList<>();
    lstName = Arrays.asList(arrName);

    for (String str : lstName) {
        System.out.println(str);
    }    

Ergebnisanzeige auf dem Monitor:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1
Hoang
quelle
gleiche Antwort wie oben - immer noch mit der statischen Methodenew Gson().fromJson()
Abel Callejo
Nun, mein Problem war anders, aber Ihr Ausschnitt löst mein Problem. Ich habe die Liste der Zeichenfolgen gespeichert, möchte aber die Zeichenfolgen abrufen. Dann erinnert mich Ihr Snippet an ihre Klasse String []., Um Daten abzurufen. Vielen Dank
Badarshahzad
2

Ich war in der Lage, die Listenzuordnung so zu gestalten, dass sie nur @SerializedNamefür alle Felder verwendet wurde. Es war keine Logik Typeerforderlich.

Wenn ich den Code - in Schritt 4 unten - über den Debugger ausführe , kann ich feststellen, dass das List<ContentImage> mGalleryImagesObjekt mit den JSON-Daten gefüllt ist

Hier ist ein Beispiel:

1. Der JSON

   {
    "name": "Some House",
    "gallery": [
      {
        "description": "Nice 300sqft. den.jpg",
        "photo_url": "image/den.jpg"
      },
      {
        "description": "Floor Plan",
        "photo_url": "image/floor_plan.jpg"
      }
    ]
  }

2. Java-Klasse mit der Liste

public class FocusArea {

    @SerializedName("name")
    private String mName;

    @SerializedName("gallery")
    private List<ContentImage> mGalleryImages;
}

3. Java-Klasse für die Listenelemente

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4. Der Java-Code, der den JSON verarbeitet

    for (String key : focusAreaKeys) {

        JsonElement sectionElement = sectionsJsonObject.get(key);
        FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
    }
Gene Bo
quelle
0

Angenommen , Sie beginnen mit mapping.get("servers").getAsJsonArray(), wenn Sie Zugriff haben Guava Streams , können Sie das tun unter Einzeiler:

List<String> servers = Streams.stream(jsonArray.iterator())
                              .map(je -> je.getAsString())
                              .collect(Collectors.toList());

Hinweis StreamSupportkann den JsonElementTyp nicht bearbeiten , daher ist er nicht ausreichend.

Alex Moore-Niemi
quelle