2012-12-06 15 views
6

मुझे पता है कि जीएसओएन प्रश्नों के साथ कई JSON हैं लेकिन उनमें से कोई भी सीधे मुझसे संबंधित नहीं है। मेरा JSON अलग रूप से स्वरूपित है।जेसन सरणी को पार्स करने के लिए जीसन का उपयोग करना और कोई नाम नहीं

मैं एक JSON डेटा है मैं GSON जो ऐसा दिखाई देता का उपयोग कर पार्स करने के लिए करना चाहते हैं:

[ 
    { 
    "foo":"1", 
    "bar":[ { "_id":"bar1"} ], 
    "too":["mall", "park"] 
    } 
] 

और मैं मॉडल वर्ग है:

ItemArray कक्षा

public class ItemArray 
{ 
    List<Item> itemArray; 

    //Get set here 
} 

आइटम कक्षा

public class Item 
{ 
    String foo; 
    List<Bar> bar; 
    List<String> too; 

    //Get set here 
} 

बार कक्षा

public class Bar 
{ 
    String id; 

    //Get set here 
} 

यहाँ सवाल। क्या JSON सही प्रारूप में है? यदि हां, तो मॉडल प्रारूप सही प्रारूप में हैं?

यदि नहीं, तो कृपया मुझे सही दिशा में फेंक दें। आपका अग्रिम में ही बहुत धन्यवाद!

पीएस। यदि आवश्यक हो तो मैं JSON डेटा प्रारूप को संशोधित कर सकता हूं।

उत्तर

6

अपने json के अनुसार, आप बस होना चाहिए:

public class ItemArray extends List<Item> { 
} 

क्या आप जावा वर्ग रखने के लिए और यह होना चाहिए अपने json बदलना चाहते हैं:

{ 
itemArray: [ 
    { 
     "foo":"1", 
     "bar":[ { "_id":"bar1"} ], 
     "too":["mall", "park"] 
    } 
    ] 
} 

ओह, और वहाँ है एक

public class Bar 
{ 
    String _id; 

    //Get set here 
} 

तुम भी एक टिप्पणी के इस्तेमाल कर सकते हैं क्षेत्र के बदलने के लिए: आईडी और बार के लिए _ id के साथ बेमेल जेसन डी/क्रमबद्धता के दौरान नाम।

और अंतिम लेकिन कम से कम नहीं, अपने मूल्यों को बेहतर टाइप करने पर विचार करें। यदि वे नहीं हैं तो तारों के रूप में कोई डेटा न देखें, आप चीजों को बदलने के लिए जावा कोड में बहुत अधिक प्रसंस्करण नहीं करेंगे। उदाहरण के लिए:

"foo" : 1, 

और एक स्ट्रिंग नहीं, एक int डेटा सदस्य के रूप में foo देखें।

+0

इसलिए दूसरे शब्दों में, मुझे केवल एक वर्ग आइटमअरे + वें चाहिए मेरे जेएसओएन प्रारूप को बदलने के बिना निश्चित रूप से ई आइटम कक्षा? –

+0

मुझे ऐसा लगता है कि हाँ। और आईडी से _id में बार बदल रहा है। – Snicolas

+0

ठीक है lemme इसे आजमाएं –

0

इस उपकरण http://jsonlint.com/

Class Bar(
    private String _id; 
    //create getter/setters 
{ 

public class Item 
{ 
    String foo; 
    List<Bar> bar; 
    List<String> too; 

    //Get set here 
} 
//this is also fine 
public class ItemList 
{ 
    List<Item> itemArray; 

    //Get set here 
} 

आप आइटम की सूची "itemArray" का नाम दिया है Json है वैध उपयोग की जाँच करने के लिए, लेकिन अपने json में आप "itemArray" आइटम की इसी सरणी का नाम नहीं है। तो इसे आइटम बनाएंअरे, समस्या आपके जेसन में नहीं है, यह मान्य है। समस्या Gson के लिए इसके प्रतिनिधित्व में है, उसी नाम के साथ ऑब्जेक्ट (यानी जावा POJO) के चर पर जेसन की जीसन मैप कुंजी। अपनी सूची के नाम क्लास है

List<Item> itemArray; 

है तो इसी json सरणी नाम भी itemArray होना चाहिए, एक नज़र झटका ले

{ 
itemArray: [ 
    { 
     "foo":"1", 
     "bar":[ { "_id":"bar1"} ], 
     "too":["mall", "park"] 
    } 
    ] 
} 

ताकि आप json वस्तु में है कि

तरह परिवर्तित कर सकते हैं
Reader reader = new InputStreamReader(IOUtils.toInputStream(json_string)); 
ItemList itemList = json.toObject(reader, ItemList.class); 

अधिक जानकारी के https://stackoverflow.com/questions/13625206/how-to-parse-the-result-in-java/13625567#13625567

के लिए झटका संदर्भ में एक नजर डालें
+0

पहले जवाब ने मेरे प्रश्न का उत्तर दिया। लेकिन आपके उत्तर और अंतर्दृष्टि के लिए धन्यवाद। मैं भविष्य में इसे ध्यान में रखूंगा: डी –

+0

क्या होगा यदि मैं जेसन प्रारूप नहीं बदल सकता। यही है, अगर मैं जेसन में "itemArray" जोड़ने में सक्षम नहीं हूं तो मॉडल कैसे सेट करें? धन्यवाद। –

4

कभी-कभी हम एक प्रतिक्रिया के रूप JsonArray [ {..} , {..} ] प्राप्त (आपके जैसे 'itemArray' नाम के बिना) उस मामले में आप कोड

Type fooType = new TypeToken<ArrayList<Item>>() {}.getType(); 
List<Item> array = new Gson().fromJson(response, fooType); 

निम्न का उपयोग कर सकते हैं इस Official doc - Gson Array-Examples

2

के बारे में अधिक जानकारी प्राप्त यदि आप एक JsonArray[ {..} , {..} ] की तरह है, तो आप इसे जीसन के साथ कर सकते हैं:

Item[] items = gson.fromJson(json, Item[].class); 
+0

मैं इसे आगे कैसे पार्स कर सकता हूं ... यानी आइटम.क्लास में स्ट्रिंग एक्सेस? –

संबंधित मुद्दे