GSON के साथ java.util.List में पार्सिंग JSON सरणी


119

मेरा निम्नलिखित सामग्री के साथ JsonObjectनाम "mapping"है:

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

मुझे पता है कि मैं इसके "servers"साथ सरणी प्राप्त कर सकता हूं :

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

और अब मैं चाहता हूँ कि JsonArrayएक java.util.List...

ऐसा करने का सबसे आसान तरीका क्या है?



2
@ एक और उस प्रश्न के बीच कई अंतर हैं। यह एक से संबंधित है Gson
हाबिल कैलेजो

@AbelMelquiadesCallejo जवाब पर एक नज़र है। मुझे आशा है कि यह आपकी समस्या को हल करेगा।
प्रेटेक

@ruakh हाँ, मैं आपसे सहमत हूँ और मुझे पता है कि मैं JsonArrayलागू करता हूँ Iterable। यह सिर्फ इतना है कि मैं एक नया पुस्तकालय जोड़ने के अलावा अन्य नए तरीके भी खोज रहा हूं।
हाबिल कैलेजो

जवाबों:


273

निश्चित रूप से ऐसा करने का सबसे आसान तरीका है कि Gson के डिफ़ॉल्ट पार्सिंग फ़ंक्शन का उपयोग कर रहा है fromJson()

जब आप किसी भी ParameterizedType(जैसे, किसी भी List) में deserialize करने की आवश्यकता के लिए उपयुक्त इस समारोह का एक कार्यान्वयन है , जो है fromJson(JsonElement json, Type typeOfT)

आपके मामले में, तुम सिर्फ प्राप्त करने की आवश्यकता Typeएक की List<String>और फिर उस में JSON सारणी पार्स Type, इस तरह:

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

आपके मामले yourJsonमें एक है JsonElement, लेकिन यह एक String, कोई भी Readerया एक भी हो सकता है JsonReader

आप Gson API प्रलेखन पर एक नज़र रखना चाहते हैं ।


7
Typeक्या पैकेज में पाया जा सकता है?
हाबिल कालेजो

10
Typeएक जावा निर्मित इंटरफ़ेस पैकेज में स्थित हैjava.lang.reflect
मिको

मुझे getString()इसके बजाय उपयोग करना था get()वरना .fromJson()शिकायत थी।
लिनोहोह

@ मायको का यहाँ Gson के साथ एक समान प्रश्न है । मैं देखना चाहता था कि क्या आप मेरी मदद कर सकते हैं। मेरे पास एक समाधान है, लेकिन समस्या यह है कि यह JSON को मैप में पार्स करने के लिए बहुत ही गड़बड़ है।
जौन

18

नीचे कोड का उपयोग कर रहा है com.google.gson.JsonArray। मैंने सूची में तत्व की संख्या के साथ-साथ सूची में तत्वों को भी मुद्रित किया है

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

}

आउटपुट

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 की आधिकारिक वेबसाइट से समाधान पढ़ा

और यह कोड आपके लिए:

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

मॉनिटर पर परिणाम दिखाएँ:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1

ऊपर के रूप में एक ही जवाब - अभी भी स्थैतिक विधि का उपयोग करnew Gson().fromJson()
हाबिल Callejo

अच्छी तरह से मेरी समस्या अन्य थी, लेकिन आपके स्निपेट ने मेरी समस्या को हल कर दिया। मैंने स्ट्रिंग की सूची संग्रहीत की, लेकिन मैं तारों को लाना चाहता हूं। तब आपका स्निपेट मुझे याद दिलाता है कि मैं स्ट्रिंग [] डाल सकता हूं। डेटा प्राप्त करने के लिए वर्ग। धन्यवाद
badarshahzad

2

मैं @SerializedNameसभी क्षेत्रों के लिए उपयोग करने के साथ सूची मैपिंग प्राप्त करने में सक्षम था .. आसपास कोई तर्क Typeआवश्यक नहीं था।

कोड चलाना - नीचे चरण # 4 में - डीबगर के माध्यम से, मैं यह देखने में सक्षम हूं कि List<ContentImage> mGalleryImagesऑब्जेक्ट JSON डेटा के साथ पॉपुलेटेड है

यहाँ एक उदाहरण है:

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. सूची के साथ जावा वर्ग

public class FocusArea {

    @SerializedName("name")
    private String mName;

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

3. सूची आइटम के लिए जावा वर्ग

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4. JSON को प्रोसेस करने वाला जावा कोड

    for (String key : focusAreaKeys) {

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

0

mapping.get("servers").getAsJsonArray()यदि आप अमरूद का उपयोग करते हैं, तो आप शुरू करते हैं , आप Streamsनीचे दिए गए एक-लाइनर को कर सकते हैं:

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

नोट प्रकार StreamSupportपर काम करने में सक्षम नहीं होगा JsonElement, इसलिए यह अपर्याप्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.