JSON सरणी पार्स करने के लिए GSON का उपयोग करना


110

मेरे पास एक JSON फाइल है:

[
    {
        "number": "3",
        "title": "hello_world",
    }, {
        "number": "2",
        "title": "hello_world",
    }
]

इससे पहले कि जब फ़ाइलों में एक रूट एलीमेंट होता था, मैं उसका उपयोग करता था:

Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);

कोड लेकिन मैं नहीं सोच सकता कि Wrapperरूट कोड को कैसे कोड किया जाए क्योंकि रूट एलीमेंट है।

मैंने प्रयोग करने की कोशिश की है:

Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);

साथ में:

public class Wrapper{

    String number;
    String title;

}

लेकिन कोई भाग्य नहीं था। इस विधि का उपयोग करके मैं इसे कैसे पढ़ सकता हूं?

PS मुझे इसका उपयोग करके काम करने के लिए मिला है:

JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");

लेकिन मैं यह जानना पसंद करूंगा कि यह कैसे करना है (यदि संभव हो तो) दोनों तरीकों से।


4
क्या आपको यकीन है कि शीर्षक तत्वों के बाद अल्पविराम है? यदि आप उन्हें हटाते हैं तो Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);मेरे लिए ठीक काम करता है।
Pshemo

1
यही समस्या है .. इतनी आसान गलती!
एडुआर्डो

जवाबों:


112

समस्या के अंत में अल्पविराम के कारण होता है (आपके मामले में प्रत्येक ) सरणी में रखा गया JSON ऑब्जेक्ट:

{
    "number": "...",
    "title": ".." ,  //<- see that comma?
}

यदि आप उन्हें हटा देते हैं तो आपका डेटा बन जाएगा

[
    {
        "number": "3",
        "title": "hello_world"
    }, {
        "number": "2",
        "title": "hello_world"
    }
]

तथा

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);

ठीक काम करना चाहिए।



1
@Snake BTW, jacksonपुस्तकालय के मामले में और यह टिप्पणी सरणी बनाने और इसे लपेटने Arrays.asList(..)से टाइपरफेन्स का उपयोग करके एक सूची बनाने की तुलना में तेज़ है। मैंने इसे gsonलाइब्रेरी के साथ परीक्षण नहीं किया, लेकिन यह इसे मानदंड के लायक हो सकता है।
साइकेमो

39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

ठीक काम करने लगता है। लेकिन ,आपके स्ट्रिंग में एक अतिरिक्त कॉमा है।

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]

16
public static <T> List<T> toList(String json, Class<T> clazz) {
    if (null == json) {
        return null;
    }
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>(){}.getType());
}

नमूना कॉल:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);

4
मेरे लिए, यह मेरी वस्तुओं को विशिष्ट वस्तुओं की सूची (उदाहरण के लिए) के बजाय लिंक्डट्रीप की सूची में बदल रहा है।
रयान न्यूजॉम

आपको GsonUtils क्लास कहाँ से मिली?
रोन्स एलिन

GsonUtilsवह वर्ग है जहाँ उन्होंने अपना toList()तरीका रखा है ।
user1438038

यह काम नहीं कर सकता है: टाइपकॉइन को एक गलत मान बनाना होगा क्योंकि टी को यह ज्ञात नहीं है कि यह कब संकलित है। वह संभवतः सूची <ऑब्जेक्ट> के लिए टाइप टोकन बनाएगा। प्रकार बनाते समय आपको वास्तविक वर्ग का उपयोग करना होगा।
हंस-पीटर स्टॉर

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