2013-05-23 7 views
7

का उपयोग कर जावा ऑब्जेक्ट पर जेएसओएन स्ट्रिंग जावा मैं जेसन को जावा में पार्स करने की कोशिश कर रहा हूं।जीएसओएन

मैं निम्न स्ट्रिंग jsonlint.com को

private final static String LOC_JSON = 
     "[" 
     +"{" 
     +" \"lat1\": 39.737567," 
     +" \"lat2\": 32.7801399," 
     +" \"long1\": -104.98471790000002," 
     +" \"long2\": -96.80045109999998" 
     +"}," 
     +" [" 
     +"  {" 
     +"   \"lat\": {" 
     +"    \"b\": 38.88368709500021," 
     +"    \"d\": 40.620468491667026" 
     +"   }," 
     +"   \"long\": {" 
     +"   \"b\": -105.75306170749764," 
     +"   \"d\": -104.675854661387" 
     +"   }" 
     +"  }" 
     +" ]" 
     +"]"; 

मैंने किसी चीज़ में पार्स करने के लिए कोशिश कर रहा हूँ और मैं निम्नलिखित त्रुटि मिलती अनुसार मान्य JSON है कि है। "BEGIN_OBJECT अपेक्षित लेकिन लाइन 1 कॉलम 2 में BEGIN_ARRAY था"

  Gson gson = new Gson(); 
     BoxSearch b = gson.fromJson(LOC_JSON, BoxSearch.class); 

BoxSearch इस के होते हैं।

private Number lat1; 
private Number lat2; 
private Number long1; 
private Number long2; 
private Boxes[] boxes; 

बॉक्स एक अक्षांश वस्तु और एक रेखांश वस्तु है जो दोनों समान परिभाषित हैं।

private String b; 
private String d; 

मैं एक और अधिक सरल BoxSearch वस्तु केवल उन 4 गुण होते हैं कि में उच्च स्तर विशेषताएं (lat1, lat2, long1 और long2) पार्स कर सकते हैं। समस्या तब आती है जब जेसन और ऑब्जेक्ट अधिक जटिल होते हैं। क्या मैं कोशिश कर रहा हूं कि मैं क्या कर रहा हूं?

मुझे आशा है कि मैंने कुछ मदद प्राप्त करने के लिए पर्याप्त जानकारी प्रदान की है। यदि आवश्यकता हो तो मुझे अधिक जानकारी या यहां तक ​​कि एक परीक्षण परियोजना प्रदान करने में खुशी होगी। मैं इसे जूनिट टेस्ट के रूप में चला रहा हूं।

धन्यवाद।

+3

[जीएसओएन फेंकने की अपेक्षा की गई डुप्लिकेट "अपेक्षित BEGIN \ _OBJECT लेकिन BEGIN \ _ARRAY"?] (Http://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin -एरे) - आपका JSON एक सरणी है, वस्तु नहीं। आपको एक समस्या होने वाली है क्योंकि यह एक सरणी है जिसमें विभिन्न प्रकार की ऑब्जेक्ट्स (ऑब्जेक्ट और एरे) शामिल हैं, जिन्हें आप कस्टम deserializer –

+0

@BrianRoach लिखने के बिना सौदा नहीं कर सकते हैं, यह एक उत्तर की तरह है;) –

+0

@RC। हाँ ... हम्म। मुझे लगता है कि शायद मैं इसे स्थानांतरित कर दूंगा, पुराना क्यू जवाब देता है कि उसे त्रुटि क्यों मिल रही है, लेकिन उसके मामले का संकल्प अलग है –

उत्तर

16

त्रुटि का कारण यह है कि शीर्ष स्तर पर आपका JSON एक सरणी है, न कि ऑब्जेक्ट। यह GSON throwing "Expected BEGIN_OBJECT but was BEGIN_ARRAY"? से ढका हुआ है।

हालांकि, समाधान आपके JSON के लिए काम नहीं करेगा क्योंकि आपके पास एक प्रकार की ऑब्जेक्ट की सरणी के बजाय मिश्रित प्रकार (ऑब्जेक्ट और एरे) की एक सरणी है। इसके लिए आपको एक कस्टम deserializer लिखना होगा (The section of the Gson user's guide that covers this देखें) या जीसन की JsonParser कक्षा का सीधे उपयोग करें और पार्स पेड़ से डेटा निकालें।

ऊपर टिप्पणी से संपादित करें:

यदि आप JSON, यह आप क्या चाहते हैं BoxSearch वस्तुओं की एक सरणी है की तरह लग रहा बनाने एक रहे हैं?

[ 
    { 
     "lat1" : 39.737567, 
     "lat2" : 32.7801399, 
     "long1" : -104.98471790000002, 
     "long2" : -96.80045109999998, 
     "boxes" : [ 
        { 
         "lat": { 
          "b": 38.88368709500021, 
          "d": 40.620468491667026 
         }, 
         "long": { 
          "b": -105.75306170749764, 
          "d": -104.675854661387 
         } 
        } 
        ] 
    } 
] 

हालांकि, जिस तरह से आप Boxes वर्ग को परिभाषित किया है कि के लिए काम नहीं करेगा:

अपने जावा BoxSearch वर्ग के आधार पर, आप की जरूरत है JSON की तरह संरचित चाहते हैं। (क्या आपका मतलब है कि उनमें से एक सरणी है?)। यह की तरह लग रहे करने की आवश्यकता होगी के रूप में-है:

Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType(); 
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType); 

तुम सच में की जरूरत नहीं है:

class Boxes { 
    Box lat; 
    @SerializedName("long") 
    Box lon; 
} 

class Box { 
    String b; 
    String d; 
} 

अब आप जो आप के साथ deserialize सकता है वस्तु (BoxSearch) का एक प्रकार से युक्त एक सरणी है इन की एक सरणी, बाहरी सरणी से छुटकारा पाने और बस कार्य करें:

gson.fromJson(json, BoxSearch.class); 
+0

बहुत बहुत धन्यवाद ब्रायन, जेसन के लिए मामूली चिमटा और सब ठीक है। मैं इस जवाब को वोट दूंगा लेकिन मेरे पास "सड़क क्रेडिट" नहीं है। कोड एक चैंप की तरह काम करता है। यदि लोग इस उत्तर की प्रतिलिपि बनाते हैं और पेस्ट करते हैं, तो बॉक्स लंबा; पुनर्नामित करने की आवश्यकता है :-) – user2415153

+0

ओह और हाँ मुझे सरणी की आवश्यकता है। एक बार फिर धन्यवाद। – user2415153

+0

@ user2415153 मैंने कोड बदल दिया है, इसलिए यह JSON में '" लंबे "के साथ काम करेगा - अब जवाब देखें :) मैंने यह नहीं देखा, क्षमा करें। उथल-पुथल के लिए - आप मेरा जवाब स्वीकार कर सकते हैं;) और खुशी है कि मैं मदद कर सकता हूं! –

13
Gson gson = new Gson(); 
gson.fromJson(jsonStr,YourClass.class); 

बहुत आसान।

+0

यह मुझे एक जेसन ऑब्जेक्ट को बदलने में मदद करता है जिसमें एक सूची है। मैं जेसन स्ट्रिंग को ऑब्जेक्ट.क्लास में परिवर्तित करता हूं – Ashkan

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