जावा के लिए GSON का उपयोग कर JSON पार्सिंग


154

मैं JSON से डेटा पार्स करना चाहूंगा जो कि प्रकार का है String। मैं Google Gson का उपयोग कर रहा हूं

मेरे पास है:

jsonLine = "
{
 "data": {
  "translations": [
   {
    "translatedText": "Hello world"
   }
  ]
 }
}
";

और मेरी कक्षा है:

public class JsonParsing{

   public void parse(String jsonLine) {

      // there I would like to get String "Hello world"

   }

}

जवाबों:


241

यह करने के लिए सरल कोड है, मैंने सभी जांचों को टाल दिया लेकिन यह मुख्य विचार है।

 public String parse(String jsonLine) {
    JsonElement jelement = new JsonParser().parse(jsonLine);
    JsonObject  jobject = jelement.getAsJsonObject();
    jobject = jobject.getAsJsonObject("data");
    JsonArray jarray = jobject.getAsJsonArray("translations");
    jobject = jarray.get(0).getAsJsonObject();
    String result = jobject.get("translatedText").getAsString();
    return result;
}

उपयोग को अधिक सामान्य बनाने के लिए - आप पाएंगे कि Gson के javadocs बहुत स्पष्ट और सहायक हैं।


1
JsonObject, JsonElement का विस्तार करता है, इसलिए यह दोनों है।
एमबीडी

पहली पंक्ति फेंकी नहीं जा सकती टाइप JsonParser के संस्करण gson-2.2.4.jar पर
अवैध तर्क

3
स्ट्रिंग परिणाम = jobject.get ("अनूदित पाठ") .String (); इस परिणाम में दोहरे उद्धरण चिह्नों को शामिल किया जाएगा। स्ट्रिंग परिणाम = jobject.get ("अनुवादित पाठ")। getAsString (); उद्धरण शामिल नहीं हैं।
user1165560

क्या मैं एकमात्र व्यक्ति हूं जो सोचता है कि 98% समय में चीजें खत्म हो जाती हैं? एक साधारण JSONObject करता है, लेकिन हम सब से नफरत है कि कोशिश / पकड़ इतना?
छल

मुझे पार्सर वर्ग का उपयोग करने की आवश्यकता है, हालांकि, मुझे MalformedJsonException मिल रही है, इसलिए मुझे JsonParser के साथ SetLeinient करने में सक्षम होना चाहिए। कैसे?
मेसन वांग

111

अपने पहले gson एप्लीकेशन में मैंने मुख्य रूप से मानों को पकड़ने के लिए अतिरिक्त कक्षाओं का उपयोग करने से परहेज किया क्योंकि मैं कॉन्फिग मामलों के लिए json का उपयोग करता हूं

जानकारी की कमी के बावजूद (यहाँ तक कि पेज भी), यही मैंने पाया और इस्तेमाल किया:

से शुरू

Map jsonJavaRootObject = new Gson().fromJson("{/*whatever your mega complex object*/}", Map.class)

हर बार जब गेसू {} को देखता है, तो यह एक मैप (वास्तव में एक गन्स स्ट्रिंग स्ट्रिंग) बनाता है

हर बार जब गन्स एक '' देखता है, तो यह एक स्ट्रिंग बनाता है

हर बार जब कोई व्यक्ति एक नंबर देखता है, तो वह एक डबल बनाता है

हर बार गन्स एक [] देखता है, यह एक ArrayList बनाता है

आप इस तथ्य (संयुक्त) का उपयोग अपने लाभ के लिए कर सकते हैं

अंत में यह कोड है जो बात बनाता है

        Map<String, Object> javaRootMapObject = new Gson().fromJson(jsonLine, Map.class);

    System.out.println(
        (
            (Map)
            (
                (List)
                (
                    (Map)
                    (
                        javaRootMapObject.get("data")
                    )
                 ).get("translations")
            ).get(0)
        ).get("translatedText")
    );

20

सबसे सरल बात आमतौर पर मिलान वस्तु पदानुक्रम बनाना है, जैसे:

public class Wrapper {
   public Data data;
}
static class Data {
   public Translation[] translations;
}
static class Translation {
   public String translatedText;
}

और फिर खेतों के माध्यम से GSON, ट्रैवर्स ऑब्जेक्ट पदानुक्रम का उपयोग करके बांधें। बुनियादी डेटा कंटेनरों के लिए गेटर्स और सेटर जोड़ना व्यर्थ है।

तो कुछ इस तरह:

Wrapper value = GSON.fromJSON(jsonString, Wrapper.class);
String text = value.data.translations[0].translatedText;

2
तब आपकी ऑब्जेक्ट संरचना JSON से मेल नहीं खा रही है।
StaxMan

14

आप जासन ऑब्जेक्ट्स के लिए संबंधित जावा क्लासेस बना सकते हैं। पूर्णांक, स्ट्रिंग मानों को मैप किया जा सकता है। Json को इस तरह पार्स किया जा सकता है-

Gson gson = new GsonBuilder().create(); 
Response r = gson.fromJson(jsonString, Response.class);

यहाँ एक उदाहरण दिया गया है- http://rowsandcolumns.blogspot.com/2013/02/url-encode-http-get-solr-request-and.html


8

आप JSON ऑब्जेक्ट का प्रतिनिधित्व करने के लिए एक अलग वर्ग का उपयोग कर सकते हैं और @SerializedNameप्रत्येक डेटा सदस्य के लिए फ़ील्ड नाम निर्दिष्ट करने के लिए एनोटेशन का उपयोग कर सकते हैं:

public class Response {

   @SerializedName("data")
   private Data data;

   private static class Data {
      @SerializedName("translations")
      public Translation[] translations;
   }

   private static class Translation {
      @SerializedName("translatedText")
      public String translatedText;
   }

   public String getTranslatedText() {
      return data.translations[0].translatedText;
   }
}

तब आप किसी Gsonवस्तु का उपयोग करके अपने पार्स () विधि में पार्सिंग कर सकते हैं :

Gson gson = new Gson();
Response response = gson.fromJson(jsonLine, Response.class);

System.out.println("Translated text: " + response.getTranslatedText());

इस दृष्टिकोण के साथ, आप Responseकिसी अन्य अतिरिक्त फ़ील्ड को जोड़ने के लिए कक्षा का पुनः उपयोग कर सकते हैं अन्य डेटा सदस्यों को लेने के लिए जिन्हें आप JSON से निकालना चाहते हैं - यदि आप एक कॉल में कई अनुवादों के लिए परिणाम प्राप्त करना चाहते हैं, तो कहते हैं, कई अनुवाद। या पता चला स्रोत भाषा के लिए एक अतिरिक्त स्ट्रिंग प्राप्त करने के लिए।


7

एक तरह से JsonObject बनाया जाएगा और मापदंडों के माध्यम से पुनरावृति होगी। उदाहरण के लिए

JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class);

तब आप बीन मान निकाल सकते हैं जैसे:

String fieldValue = jobj.get(fieldName).getAsString();
boolean fieldValue = jobj.get(fieldName).getAsBoolean();
int fieldValue = jobj.get(fieldName).getAsInt();

उम्मीद है की यह मदद करेगा।


5

Gson to Solve
I का उपयोग करके मैं json स्ट्रिंग में अलग-अलग पैरामीटर के लिए एक वर्ग तैयार करूँगा । वैकल्पिक रूप से आप "डेटा" नामक एक मुख्य वर्ग बना सकते हैं और फिर इसी तरह आंतरिक कक्षाएं बना सकते हैं। मैंने स्पष्टता के लिए अलग कक्षाएं बनाईं।

कक्षाएं इस प्रकार हैं।

  • डेटा
  • अनुवाद
  • TranslatedText

JsonParsing "Parse" विधि में क्लास में हम कॉल करते हैं gson.fromJson(jsonLine, Data.class)जो String को java ऑब्जेक्ट्स में Reflection का उपयोग करके परिवर्तित करेगी।

एक बार जब हमारे पास "डेटा" ऑब्जेक्ट तक पहुंच होती है, तो हम प्रत्येक पैरामीटर को व्यक्तिगत रूप से एक्सेस कर सकते हैं।

इस कोड का परीक्षण करने का मौका नहीं मिला क्योंकि मैं अपने देव मशीन से दूर हूं। लेकिन यह मदद करनी चाहिए।

कुछ अच्छे उदाहरण और लेख।
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide

कोड

public class JsonParsing{

       public void parse(String jsonLine) {

           Gson gson = new GsonBuilder().create();
           Data data = gson.fromJson(jsonLine, Data.class);

           Translations translations = data.getTranslation();
           TranslatedText[] arrayTranslatedText = translations.getArrayTranslatedText(); //this returns an array, based on json string

           for(TranslatedText translatedText:arrayTranslatedText )
           {
                  System.out.println(translatedText.getArrayTranslatedText());
           }
       }

    }


    public class Data{
           private  Translations translations;
          public Translations getTranslation()
          {
             return translations;
          }

          public void setTranslation(Translations translations)
           {
                  this.translations = translations;
           }
    }

    public class Translations
    {
        private  TranslatedText[] translatedText;
         public TranslatedText[] getArrayTranslatedText()
         {
             return translatedText;
         }

           public void setTranslatedText(TranslatedText[] translatedText)
           {
                  this.translatedText= translatedText;
           }
    }

    public class TranslatedText
    {
        private String translatedText;
        public String getTranslatedText()
        {
           return translatedText;
        }

        public void setTranslatedText(String translatedText)
        {
           this.translatedText = translatedText;
        }
    }

क्या आपको उन सहायक वर्गों पर कुछ बसने की ज़रूरत नहीं है? private String translatedTextएक्सेस कंट्रोल का उल्लंघन किए बिना कुछ भी सेट नहीं किया जा सकता है , इसलिए fromJSONJVM में ऐसा कोई भी तरीका सेट नहीं किया जा सकता, जिसने एक्सेस कंट्रोल में रिफ्लेक्ट-इन रिफ्लेक्शन ट्रैम्पलिंग न की हो।
माइक सैमुअल

@ माइक सैमुअल शूट सेटर्स के बारे में पूरी तरह से भूल गए
केन्सन जॉन

3
    JsonParser parser = new JsonParser();
    JsonObject jo = (JsonObject) parser.parse(data);
    JsonElement je = jo.get("some_array");

    //Parsing back the string as Array
    JsonArray ja = (JsonArray) parser.parse(o.get("some_array").getAsString());
    for (JsonElement jo : ja) {
    JsonObject j = (JsonObject) jo;
        // Your Code, Access json elements as j.get("some_element")
    }

JSON को इस तरह पार्स करने का एक सरल उदाहरण है

{"some_array": "[\" some_element \ ": 1, \" some_more_element \ ": 2]", "some_other_element": 3}


2

सबसे पहले पार्सिंग साइट के नीचे गेट्टर और सेटर जेनरेट करें

http://www.jsonschema2pojo.org/

अब Gson का उपयोग करें

GettetSetterClass object=new Gson().fromjson(jsonLine,GettetSetterClass.class);

अब डेटा, ट्रांसलेशन जैसे मूल्यों को प्राप्त करने के लिए ऑब्जेक्ट का उपयोग करें


2

मान निकालने के लिए आप JsonPath क्वेरी का उपयोग कर सकते हैं। और JsonSurfer के साथ जो Gson द्वारा समर्थित है, आपकी समस्या को केवल दो लाइन कोड द्वारा हल किया जा सकता है!

    JsonSurfer jsonSurfer = JsonSurfer.gson();
    String result = jsonSurfer.collectOne(jsonLine, String.class, "$.data.translations[0].translatedText");

1

एक पंक्ति कोड:

System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.