2011-09-05 14 views
35

मैं निम्न स्वरूप जो JSON Lint एक "वैध प्रतिक्रिया" के रूप में इस से पता चलता में एक JSON परिणाम है।नेस्टेड JSON परिणाम में गतिशील JSON कुंजी का विश्लेषण कैसे करें?

मेरा प्रश्न है: "141", "8911" आदि के बाद से "प्रश्न_मार्क" की सामग्री तक मैं कैसे पहुंच सकता हूं, सभी गतिशील मान हैं?

"उत्पाद" के मूल्य तक पहुंचने के लिए मेरा नमूना कोड।

//Consider I have the first <code>JSONObject</code> of the "search_result" array and 
//I access it's "product" value as below. 
String product = jsonObject.optString("product"); //where jsonObject is of type JSONObject. 
//<code>product<code> now contains "abc". 

JSON:

{ 
"status": "OK", 
"search_result": [ 

      { 
       "product": "abc", 
       "id": "1132", 
       "question_mark": { 
        "141": { 
         "count": "141", 
         "more_description": "this is abc", 
         "seq": "2" 
        }, 
        "8911": { 
         "count": "8911", 
         "more_desc": "this is cup", 
         "seq": "1" 
        } 
       }, 
       "name": "some name", 
       "description": "This is some product" 
      }, 
      { 
       "product": "XYZ", 
       "id": "1129", 
       "question_mark": { 
        "379": { 
         "count": "379", 
         "more_desc": "this is xyz", 
         "seq": "5" 
        }, 
        "845": { 
         "count": "845", 
         "more_desc": "this is table", 
         "seq": "6" 
        }, 
        "12383": { 
         "count": "12383", 
         "more_desc": "Jumbo", 
         "seq": "4" 
        }, 
        "257258": { 
         "count": "257258", 
         "more_desc": "large", 
         "seq": "1" 
        } 
       }, 
       "name": "some other name", 
       "description": "this is some other product" 
      } 
     ] 
} 

मेरा प्रश्न शीर्षक "गतिशील कुंजी" गलत हो सकता है, लेकिन मैं इस बात को इस मुद्दे के लिए एक बेहतर नाम क्या में पता नहीं है।

किसी भी मदद की सराहना की जाएगी!

+0

मुझे लगता है कि आप इसे निष्पादित करने से पहले question_mark अंदर वस्तु के मूल्यों होने होना चाहिए। क्या तुम्हारे पास है? –

+0

umm, नहीं। मुझे नहीं पता कि प्रश्न चिह्न के अंदर मूल्यों का उपयोग कैसे किया जाए। इसके लिए मुझे jsonObj.optJSONObject ("141") करना होगा; जहां 141 गतिशील है और मैं इसे पहले से नहीं जानता। –

उत्तर

99

कुंजी प्राप्त करने के लिए JSONObject keys() का उपयोग करें और फिर गतिशील मान प्राप्त करने के लिए प्रत्येक कुंजी को फिर से सक्रिय करें।

मोटे तौर पर कोड की तरह दिखेगा: एक और संभावना


    // searchResult refers to the current element in the array "search_result" 
    JSONObject questionMark = searchResult.getJSONObject("question_mark"); 
    Iterator keys = questionMark.keys(); 

    while(keys.hasNext()) { 
     // loop to get the dynamic key 
     String currentDynamicKey = (String)keys.next(); 

     // get the value of the dynamic key 
     JSONObject currentDynamicValue = questionMark.getJSONObject(currentDynamicKey); 

     // do something here with the value... 
    } 

+0

+1 बहुत बढ़िया! यह ठीक काम किया! मैंने आपकी पिछली प्रतिक्रिया देखी जो कि चाबियों() का उपयोग करने का सुझाव दिया और मैंने बाहरी चाबियों को प्रिंट करना समाप्त कर दिया। अगर यह आपके नमूना कोड के लिए नहीं था, तो मैं एक और सवाल पूछना समाप्त कर दिया! : पी तत्काल प्रतिक्रिया के लिए फिर से धन्यवाद! उच्च समय SO ने एक महान उत्तर के लिए एकाधिक अपवॉट्स का समर्थन किया! –

+1

सहायता करने में सक्षम होने के लिए खुशी हुई :) यदि आपके कोई प्रश्न हैं तो मुझे बताएं। हम (एसओ समुदाय) – momo

+0

में मदद करने के लिए यहां हैं, मैंने एक बार आपके कोड का उपयोग किया और फिर एक और कुडोस के लिए फिर से हूं –

11

उपयोग करने के लिए Gson है (ध्यान दें, मैं यहाँ lombok उपयोग करने के लिए उत्पन्न करता है getters/setters, toString, आदि):

package so7304002; 

import java.util.List; 
import java.util.Map; 

import lombok.AccessLevel; 
import lombok.Data; 
import lombok.NoArgsConstructor; 

import com.google.gson.Gson; 
import com.google.gson.annotations.SerializedName; 
import com.google.gson.reflect.TypeToken; 

@NoArgsConstructor(access = AccessLevel.PRIVATE) 
public final class JsonDemo { 
    @Data 
    private static class MyMap { 
     private int count; 

     @SerializedName("more_description") 
     private String moreDescription; 

     private int seq; 
    } 

    @Data 
    private static class Product { 
     private String product; 

     private int id; 

     @SerializedName("question_mark") 
     private Map<String, MyMap> questionMark; 
    } 

    @Data 
    private static class MyObject { 
     private String status; 

     @SerializedName("search_result") 
     private List<Product> searchResult; 
    } 

    private static final String INPUT = ""; // your JSON 

    public static void main(final String[] arg) { 
     final MyObject fromJson = new Gson().fromJson(INPUT, 
      new TypeToken<MyObject>(){}.getType()); 
     final List<Product> searchResult = fromJson.getSearchResult(); 
     for (final Product p : searchResult) { 
      System.out.println("product: " + p.getProduct() 
       + "\n" + p.getQuestionMark()+ "\n"); 
     } 
    } 
} 

आउटपुट :

product: abc 
{141=JsonDemo.MyMap(count=141, moreDescription=this is abc, seq=2), 
8911=JsonDemo.MyMap(count=8911, moreDescription=null, seq=1)} 

product: XYZ 
{379=JsonDemo.MyMap(count=379, moreDescription=null, seq=5), 
845=JsonDemo.MyMap(count=845, moreDescription=null, seq=6), 
12383=JsonDemo.MyMap(count=12383, moreDescription=null, seq=4), 
257258=JsonDemo.MyMap(count=257258, moreDescription=null, seq=1)} 
+0

जीएसओएन, आरसी पर उस उपयोगी जानकारी और ट्यूटोरियल के लिए धन्यवाद। एक पूर्ण कोड उदाहरण बनाने के अतिरिक्त प्रयासों के लिए +1 - यह दूसरों के लिए भी सहायक होगा। –

0

एक ही बात भी usin किया जा सकता है जी जीएसओएन, लेकिन जीएसओएन कनवर्टर एडाप्टर का उपयोग पीओजेओ में कनवर्ट करने के बजाय। हम इसे मैन्युअल रूप से पार्स करेंगे। जो गतिशील JSON डेटा के मामले में हमें लचीलापन देता है।
मान लें कि जेएसओएन प्रारूप मेरे मामले में नीचे जैसा है।

{ 
    "dateWiseContent": { 
    "02-04-2017": [ 
     { 
     "locality": " Cross Madian Cross Rd No 4" 
     } 
    ], 
    "04-04-2017": [ 
     { 
     "locality": "Dsilva Wadi" 
     }, 
     { 
     "locality": " Cross Madian Cross Rd No 4", 
     "appointments": [] 
     } 
    ] 
    } 
} 
इस मामले में

dateWiseContentगतिशील वस्तु कुंजी तो हम इस json JsonParser वर्ग का उपयोग कर स्ट्रिंग पार्स जाएगा।

//parsing string response to json object 
JsonObject jsonObject = (JsonObject) new JsonParser().parse(resource); 
    //getting root object 
JsonObject dateWiseContent = jsonObject.get("dateWiseContent").getAsJsonObject(); 

Map.Entry<String, JsonElement> का उपयोग कर गतिशील कुंजी नीचे

// your code goes here 
     for (Map.Entry<String, JsonElement> entry : dateWiseContent.entrySet()) { 

      //this gets the dynamic keys 
      String dateKey = entry.getKey(); 

      //you can get any thing now json element,array,object according to json. 

      JsonArray jsonArrayDates = entry.getValue().getAsJsonArray(); 
      int appointmentsSize = jsonArrayDates.size(); 

      for (int count = 0; count < appointmentsSize; count++) { 

        JsonObject objectData = jsonArrayDates.get(count).getAsJsonObject(); 
        String locality = objectData.get("locality").getAsString(); 


      } 
     } 

Map.Entry<String,JsonElement>

0

से Google Gson

JSON डेटा का उपयोग करने का एक उदाहरण का उपयोग करते हुए इसी तरह गतिशील json के किसी भी स्तर पार्स किया जा सकता दिए गए मिलता है प्रश्न:

{ 
    "status": "OK", 
    "search_result": [ 
     { 
      "product": "abc", 
      "id": "1132", 
      "question_mark": { 
       "141": { 
        "count": "141", 
        "more_description": "this is abc", 
        "seq": "2" 
       }, 
       "8911": { 
        "count": "8911", 
        "more_desc": "this is cup", 
        "seq": "1" 
       } 
      }, 
      "name": "some name", 
      "description": "This is some product" 
     }, 
     { 
      "product": "XYZ", 
      "id": "1129", 
      "question_mark": { 
       "379": { 
        "count": "379", 
        "more_desc": "this is xyz", 
        "seq": "5" 
       }, 
       "845": { 
        "count": "845", 
        "more_desc": "this is table", 
        "seq": "6" 
       }, 
       "12383": { 
        "count": "12383", 
        "more_desc": "Jumbo", 
        "seq": "4" 
       }, 
       "257258": { 
        "count": "257258", 
        "more_desc": "large", 
        "seq": "1" 
       } 
      }, 
      "name": "some other name", 
      "description": "this is some other product" 
     } 
    ] 
} 

उदाहरण कोड:

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

public class GsonExercise { 
    public static void main(String[] args) { 
     String jsonString = "{\"status\":\"OK\",\"search_result\":[{\"product\":\"abc\",\"id\":\"1132\",\"question_mark\":{\"141\":{\"count\":\"141\",\"more_description\":\"this is abc\",\"seq\":\"2\"},\"8911\":{\"count\":\"8911\",\"more_desc\":\"this is cup\",\"seq\":\"1\"}},\"name\":\"some name\",\"description\":\"This is some product\"},{\"product\":\"XYZ\",\"id\":\"1129\",\"question_mark\":{\"379\":{\"count\":\"379\",\"more_desc\":\"this is xyz\",\"seq\":\"5\"},\"845\":{\"count\":\"845\",\"more_desc\":\"this is table\",\"seq\":\"6\"},\"12383\":{\"count\":\"12383\",\"more_desc\":\"Jumbo\",\"seq\":\"4\"},\"257258\":{\"count\":\"257258\",\"more_desc\":\"large\",\"seq\":\"1\"}},\"name\":\"some other name\",\"description\":\"this is some other product\"}]}"; 
     JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class); 
     JsonArray ja = jobj.get("search_result").getAsJsonArray(); 
     ja.forEach(el -> { 
      System.out.println("product: " + el.getAsJsonObject().get("product").getAsString()); 
      JsonObject jo = el.getAsJsonObject().get("question_mark").getAsJsonObject();    
      jo.entrySet().stream().forEach(qm -> { 
       String key = qm.getKey(); 
       JsonElement je = qm.getValue(); 
       System.out.println("key: " + key); 
       JsonObject o = je.getAsJsonObject(); 
       o.entrySet().stream().forEach(prop -> { 
        System.out.println("\tname: " + prop.getKey() + " (value: " + prop.getValue().getAsString() + ")"); 
       }); 
      }); 
      System.out.println(""); 
     }); 
    } 
} 

आउटपुट:

product: abc 
key: 141 
    name: count (value: 141) 
    name: more_description (value: this is abc) 
    name: seq (value: 2) 
key: 8911 
    name: count (value: 8911) 
    name: more_desc (value: this is cup) 
    name: seq (value: 1) 

product: XYZ 
key: 379 
    name: count (value: 379) 
    name: more_desc (value: this is xyz) 
    name: seq (value: 5) 
key: 845 
    name: count (value: 845) 
    name: more_desc (value: this is table) 
    name: seq (value: 6) 
key: 12383 
    name: count (value: 12383) 
    name: more_desc (value: Jumbo) 
    name: seq (value: 4) 
key: 257258 
    name: count (value: 257258) 
    name: more_desc (value: large) 
    name: seq (value: 1) 
संबंधित मुद्दे