Analisi dell'array JSON in java.util.List con Gson


119

Ho un JsonObjectnome "mapping"con il seguente contenuto:

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

So di poter ottenere l'array "servers"con:

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

E ora voglio analizzarlo JsonArrayin un java.util.List...

Qual è il modo più semplice per farlo?



2
@ruakh ci sono molte differenze tra quella e questa domanda. Questo si occupa di Gson.
Abel Callejo

@AbelMelquiadesCallejo dai un'occhiata alla risposta, spero che risolverà il tuo problema.
Prateek

@ruakh si sono d'accordo con te e conosco gli JsonArrayattrezzi Iterable. È solo che sto anche trovando nuovi modi diversi dall'aggiunta di una nuova libreria.
Abel Callejo

Risposte:


273

Sicuramente il modo più semplice per farlo è utilizzare la funzione di analisi predefinita di Gson fromJson().

Esiste un'implementazione di questa funzione adatta per quando è necessario deserializzare in any ParameterizedType(eg, any List), che è fromJson(JsonElement json, Type typeOfT).

Nel tuo caso, devi solo ottenere il Typedi a List<String>e quindi analizzare l'array JSON in quello Type, in questo modo:

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

Nel tuo caso yourJsonè a JsonElement, ma potrebbe anche essere a String, any Readero a JsonReader.

Potresti voler dare un'occhiata alla documentazione dell'API Gson .


7
Typepuò essere trovato in quale pacchetto?
Abel Callejo

10
Typeè un'interfaccia Java incorporata situata nel pacchettojava.lang.reflect
MikO

Ho dovuto usare getString()invece di get()altrimenti .fromJson()si lamentava.
Lenooh

@MikO Ho una domanda simile con Gson qui . Volevo vedere se puoi darmi una mano. Ho una soluzione ma il problema è che sembra molto disordinato solo per analizzare un JSON in una mappa.
giovanni

18

Di seguito viene utilizzato il codice com.google.gson.JsonArray. Ho stampato il numero di elementi nell'elenco così come gli elementi in elenco

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

}

PRODUZIONE

List size is : 4

List Elements are  : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]

8

Ho letto la soluzione dal sito ufficiale di Gson qui

E questo codice per te:

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

Risultato visualizzato sul monitor:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1

stessa risposta come sopra - sempre usando il metodo staticonew Gson().fromJson()
Abel Callejo

beh, il mio problema era altro ma il tuo frammento risolve il mio problema. Ho memorizzato l'elenco di stringhe ma voglio recuperare le stringhe. Quindi il tuo frammento mi ricorda della loro classe I can put String []. Per recuperare i dati. Grazie
badarshahzad

2

Sono stato in grado di far funzionare la mappatura dell'elenco utilizzando solo @SerializedNameper tutti i campi .. non Typeera necessaria alcuna logica .

Eseguendo il codice - nel passaggio 4 di seguito - tramite il debugger, sono in grado di osservare che l' List<ContentImage> mGalleryImagesoggetto popolato con i dati JSON

Ecco un esempio:

1. Il 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. Classe Java con List

public class FocusArea {

    @SerializedName("name")
    private String mName;

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

3. Classe Java per gli elementi dell'elenco

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4. Il codice Java che elabora il JSON

    for (String key : focusAreaKeys) {

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

0

Dato che inizi con mapping.get("servers").getAsJsonArray(), se hai accesso a Guava Streams , puoi eseguire il seguente one-liner:

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

Nota StreamSupportnon sarà in grado di lavorare sul JsonElementtipo, quindi è insufficiente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.