JSON dizisini java.util.List ile Gson ile ayrıştırma


119

Aşağıdaki içeriğe sahip bir JsonObjectisimim var "mapping":

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

Diziyi şu şekilde alabileceğimi biliyorum "servers":

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

Ve şimdi bunu JsonArraybir java.util.List...

Bunu yapmanın en kolay yolu nedir?



2
@ruakh bununla bu soru arasında birçok fark var. Bununla ilgileniyor Gson.
Abel Callejo

@AbelMelquiadesCallejo cevaba bir göz atın.Umarım sorununuzu çözer.
Prateek

@ruakh evet sana katılıyorum ve JsonArrayaletleri biliyorum Iterable. Sadece yeni bir kitaplık eklemekten başka yeni yollar da buluyorum.
Abel Callejo

Yanıtlar:


273

Kesinlikle bunu yapmanın en kolay yolu, Gson'un varsayılan ayrıştırma işlevini kullanmaktır fromJson().

Bu işlevin ParameterizedType, herhangi bir (örneğin, herhangi biri List) serisini kaldırmanız gerektiğinde uygun bir uygulaması vardır fromJson(JsonElement json, Type typeOfT).

Senin durumunda, sadece almak gerekir Typea List<String>ve daha sonra bu JSON dizi ayrıştırmak Typebu gibi:

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

Sizin durumunuzda yourJsona JsonElement, ama aynı zamanda a String, herhangi biri Readerveya a da olabilir JsonReader.

Gson API belgelerine göz atmak isteyebilirsiniz .


8
Typehangi pakette bulunabilir?
Abel Callejo

10
Typepakette bulunan yerleşik bir Java arabirimidirjava.lang.reflect
MikO

Ben kullanmak zorunda getString()yerine get()ya da başka .fromJson()şikayetçi oldu.
lenooh

@MikO Burada Gson ile benzer bir sorum var . Bana yardım edip edemeyeceğini görmek istedim. Bir çözümüm var ama sorun şu ki, bir JSON'u bir Haritaya ayrıştırmak çok dağınık görünüyor.
John

18

Aşağıdaki kod kullanıyor com.google.gson.JsonArray. Listedeki eleman sayısını ve Listedeki elemanları yazdırdım

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

}

ÇIKTI

List size is : 4

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

8

Gson'un resmi web sitesinden çözümü burada okudum

Ve bu kod sizin için:

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

Monitörde sonuç gösterisi:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1

yukarıdaki ile aynı cevap - hala statik yöntem kullanılıyornew Gson().fromJson()
Abel Callejo

Pekala benim sorunum başkaydı ama pasajınız sorunumu çözdü. İplerin listesini sakladım ama dizeleri almak istiyorum. Sonra snippet'iniz, verileri getirmek için String []. Teşekkür ederim
badarshahzad

2

Sadece @SerializedNametüm alanlar için kullanarak liste eşlemesini çalıştırmayı başardım .. Etrafta mantık Typegerekmedi.

Aşağıdaki 4. adımda kodu hata ayıklayıcı aracılığıyla çalıştırarak, List<ContentImage> mGalleryImagesnesnenin JSON verileriyle doldurulduğunu gözlemleyebiliyorum

İşte bir örnek:

1. 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. Liste ile Java sınıfı

public class FocusArea {

    @SerializedName("name")
    private String mName;

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

3. Liste öğeleri için Java sınıfı

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4. JSON'u işleyen Java kodu

    for (String key : focusAreaKeys) {

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

0

Eğer ile başlayan Verilen mapping.get("servers").getAsJsonArray()sen erişiminiz varsa, Guava Streams , seni tek astar aşağıda yapabilirsiniz:

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

Not StreamSupport, yazı üzerinde çalışamayacağı için JsonElementyetersizdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.