जावा के साथ JSONArray में आइटम के सदस्यों तक पहुँचना


122

मैं सिर्फ जावा के साथ json का उपयोग कर रहा हूँ। मुझे यकीन नहीं है कि JSONArray के भीतर स्ट्रिंग मानों का उपयोग कैसे किया जाए। उदाहरण के लिए, मेरा जसन इस तरह दिखता है:

{
  "locations": {
    "record": [
      {
        "id": 8817,
        "loc": "NEW YORK CITY"
      },
      {
        "id": 2873,
        "loc": "UNITED STATES"
      },
      {
        "id": 1501
        "loc": "NEW YORK STATE"
      }
    ]
  }
}

मेरा कोड:

JSONObject req = new JSONObject(join(loadStrings(data.json),""));
JSONObject locs = req.getJSONObject("locations");
JSONArray recs = locs.getJSONArray("record");

मैं इस बिंदु पर "रिकॉर्ड" JSONArray का उपयोग कर सकता हूं, लेकिन इस बात के लिए अनिश्चित हूं कि मुझे लूप के लिए "आईडी" और "लोक" मान कैसे मिलेंगे। क्षमा करें यदि यह विवरण बहुत स्पष्ट नहीं है, तो मैं प्रोग्रामिंग के लिए थोड़ा नया हूं।


2
एक और बात (शायद आपने इसे पाया) - आप तीसरे आईडी मूल्य के बाद अल्पविराम से चूक गए हैं। यह अच्छा है करने के लिए हमेशा उदाहरण के लिए, कुछ पार्सर का उपयोग json.parser.online.fr
क्रिस्टियन

जवाबों:


218

क्या आपने अपना फॉर-लूप बनाने के लिए JSONArray.getJSONObject (int) , और JSONArray.length () का उपयोग करने की कोशिश की है :

for (int i = 0; i < recs.length(); ++i) {
    JSONObject rec = recs.getJSONObject(i);
    int id = rec.getInt("id");
    String loc = rec.getString("loc");
    // ...
}

मुझे यह नहीं मिलता। यदि हम idएक पापी के साथ मिल सकते हैं getIntजैसे कि हम कुंजी को निर्दिष्ट करके एक हैशमैप का मूल्य कैसे प्राप्त करते हैं, तो हमें लूप के लिए पुनरावृति क्यों करना पड़ता है? क्या लूप के साथ चलना कई बार idनियत नहीं किया int idजाता है?
नव

अधिक जटिल के लिए JSON को प्रति उदाहरण
javacodegeeks.com/core-java/json/…

मैं php के लिए यह कैसे कर सकता हूं?
हनी असेमी

अगर मुझे आईडी पता है, लेकिन मिलान स्थान की आवश्यकता है तो यह कैसे काम करेगा?
टोफानहासअवृत

6

एक org.json.JSONArray चलने योग्य नहीं है।
यहां बताया गया है कि मैं net.sf.json.JSONArray में तत्वों को कैसे संसाधित करता हूं :

    JSONArray lineItems = jsonObject.getJSONArray("lineItems");
    for (Object o : lineItems) {
        JSONObject jsonLineItem = (JSONObject) o;
        String key = jsonLineItem.getString("key");
        String value = jsonLineItem.getString("value");
        ...
    }

बहुत अच्छा काम करता है... :)


10
यह मेरे लिए काम नहीं करता है, क्योंकि JSONArrayयह चलने योग्य नहीं है।
माईचेल404

8
org.json.JSONArray iterable नहीं है, लेकिन net.sf.json.JSONArray Iterable है
majgis

आपका लिंक टूट गया है
VdeX

4

जावा 8 लगभग 2 दशकों के बाद बाजार में है, निम्नलिखित org.json.JSONArrayjava8 स्ट्रीम एपीआई के साथ पुनरावृति करने का तरीका है ।

import org.json.JSONArray;
import org.json.JSONObject;

@Test
public void access_org_JsonArray() {
    //Given: array
    JSONArray jsonArray = new JSONArray(Arrays.asList(new JSONObject(
                    new HashMap() {{
                        put("a", 100);
                        put("b", 200);
                    }}
            ),
            new JSONObject(
                    new HashMap() {{
                        put("a", 300);
                        put("b", 400);
                    }}
            )));

    //Then: convert to List<JSONObject>
    List<JSONObject> jsonItems = IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .collect(Collectors.toList());

    // you can access the array elements now
    jsonItems.forEach(arrayElement -> System.out.println(arrayElement.get("a")));
    // prints 100, 300
}

यदि पुनरावृत्ति केवल एक बार होती है, (कोई ज़रूरत नहीं है .collect)

    IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .forEach(item -> {
               System.out.println(item);
            });

1
.mapToObjशो "बिना क्रिया का अपवाद: JSONException"
Andrejs

1
वाक्यविन्यास में .mapToObj(index -> (JSONObject) array.get(index)), jsonArray.get(index)जो संभावित रूप से फेंक सकते हैं, JSONExceptionलेकिन JSONException extends RuntimeExceptionइसलिए इसे कम से कम संकलन समय पर ठीक करना चाहिए
प्रयागपाद

2

आपके कोड को देखकर, मुझे लगता है कि आप JSONLIB का उपयोग कर रहे हैं। अगर ऐसा था, तो जेन्स ऐरे को जावा एरे में बदलने के लिए निम्न स्निपेट देखें।

 JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( input );  
 JsonConfig jsonConfig = new JsonConfig();  
 jsonConfig.setArrayMode( JsonConfig.MODE_OBJECT_ARRAY );  
 jsonConfig.setRootClass( Integer.TYPE );  
 int[] output = (int[]) JSONSerializer.toJava( jsonArray, jsonConfig );  

0

यदि यह किसी और की मदद करता है, तो मैं इस तरह से कुछ करके सरणी में परिवर्तित करने में सक्षम था,

JSONObject jsonObject = (JSONObject)new JSONParser().parse(jsonString);
((JSONArray) jsonObject).toArray()

... या आपको लंबाई प्राप्त करने में सक्षम होना चाहिए

((JSONArray) myJsonArray).toArray().length

org.json.JSONObjectएक toJSONArray(JSONArray names)विधि है और org.json.JSONArrayएक toJSONObject(JSONArray names)विधि है, लेकिन यह एक toArray()विधि नहीं है ।
ब्रायनस

-1

HashMap regs = (HashMap) parser.parse (stringjson);

(स्ट्रिंग) (( HashMap ।) Regs.get ( "firstlevelkey")) मिलता है ( "secondlevelkey");


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