JsonMappingException: START_ARRAY टोकन से बाहर


112

निम्नलिखित .json फ़ाइल को देखते हुए:

[
    {
        "name" : "New York",
        "number" : "732921",
        "center" : [
                "latitude" : 38.895111, 
                "longitude" : -77.036667
            ]
    },
    {
        "name" : "San Francisco",
        "number" : "298732",
        "center" : [
                "latitude" : 37.783333, 
                "longitude" : -122.416667
            ]
    }
]

निहित डेटा का प्रतिनिधित्व करने के लिए मैंने दो कक्षाएं तैयार कीं:

public class Location {
    public String name;
    public int number;
    public GeoPoint center;
}

...

public class GeoPoint {
    public double latitude;
    public double longitude;
}

.Json फ़ाइल से सामग्री को पार्स करने के लिए मैं जैक्सन 2.2.x का उपयोग करता हूं और निम्नलिखित विधि तैयार करता हूं :

public static List<Location> getLocations(InputStream inputStream) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        TypeFactory typeFactory = objectMapper.getTypeFactory();
        CollectionType collectionType = typeFactory.constructCollectionType(
                                            List.class, Location.class);
        return objectMapper.readValue(inputStream, collectionType);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

जब तक मैं centerसंपत्ति छोड़ देता हूं तब तक सभी सामग्री को पार्स किया जा सकता है। हालाँकि, जब मैं भू-निर्देशांक को पार्स करने का प्रयास करता हूं तो मैं निम्नलिखित त्रुटि संदेश के साथ समाप्त होता हूं:

com.fasterxml.jackson.databind.JsonMappingException:
com.example.GeoPoint के उदाहरण deserialize नहीं कर सकते [START_ARRAY टोकन से] स्रोत: android.content.res.AssetManager>AssetInputStream@416a5850; पंक्ति: 5, कॉलम: 25]
(संदर्भ श्रृंखला के माध्यम से: com.example.Location ["केंद्र"])


आप जैक्सन का उपयोग क्यों कर रहे हैं यदि आप इसे केवल पार्सन के साथ पार्स कर सकते हैं
शशांक अग्रवाल

4
आपका JSON स्ट्रिंग विकृत है, का प्रकार centerअमान्य वस्तुओं की एक सरणी है। बदलने के लिए प्रयास करें [और ]साथ {और }चारों ओर JSON स्ट्रिंग में longitudeऔर latitudeइसलिए वे वस्तुओं हो जाएगा।
काटोना

1
@ कटोना धन्यवाद। क्या आप कृपया अपनी टिप्पणी को उत्तर में परिवर्तित कर सकते हैं ताकि मैं प्रश्न को बंद कर सकूँ?
JJD

जवाबों:


75

आपका JSON स्ट्रिंग विकृत है: प्रकार centerकी अमान्य वस्तुओं की एक सरणी है। बदलें [और उसके ]साथ {और }JSON स्ट्रिंग में चारों ओर longitudeऔर latitudeइसलिए वे ऑब्जेक्ट होंगे:

[
    {
        "name" : "New York",
        "number" : "732921",
        "center" : {
                "latitude" : 38.895111, 
                "longitude" : -77.036667
            }
    },
    {
        "name" : "San Francisco",
        "number" : "298732",
        "center" : {
                "latitude" : 37.783333, 
                "longitude" : -122.416667
            }
    }
]

1
वही समस्या जो मेरे पास थी, लेकिन यह जैकसन 2.6.3v के बाद से पागल थी, एक पूरी तरह से अलग त्रुटि थी, और 2.9.8v के साथ सब कुछ काम किया। धिक्कार है, इसलिए ये क्रमबद्धता त्रुटियां इतनी कष्टप्रद हैं।
brebDev

114

JsonMappingException: out of START_ARRAY tokenअपवाद जैक्सन ऑब्जेक्ट मैपर द्वारा फेंका गया है क्योंकि यह उम्मीद कर रहा है Object {}जबकि इसे Array [{}]प्रतिक्रिया में मिला ।

इस जगह से हल किया जा सकता Objectके साथ Object[]के लिए बहस में geForObject("url",Object[].class)। संदर्भ:

  1. Ref.1
  2. Ref.2
  3. Ref.3

9

मैंने JSONLint.com से json की पुष्टि करने और फिर इसे ठीक करने के रूप में इस समस्या को हल किया। और यह उसी के लिए कोड है।

String jsonStr = "[{\r\n" + "\"name\":\"New York\",\r\n" + "\"number\": \"732921\",\r\n"+ "\"center\": {\r\n" + "\"latitude\": 38.895111,\r\n"  + " \"longitude\": -77.036667\r\n" + "}\r\n" + "},\r\n" + " {\r\n"+ "\"name\": \"San Francisco\",\r\n" +\"number\":\"298732\",\r\n"+ "\"center\": {\r\n" + "    \"latitude\": 37.783333,\r\n"+ "\"longitude\": -122.416667\r\n" + "}\r\n" + "}\r\n" + "]";

ObjectMapper mapper = new ObjectMapper();
MyPojo[] jsonObj = mapper.readValue(jsonStr, MyPojo[].class);

for (MyPojo itr : jsonObj) {
    System.out.println("Val of name is: " + itr.getName());
    System.out.println("Val of number is: " + itr.getNumber());
    System.out.println("Val of latitude is: " + 
        itr.getCenter().getLatitude());
    System.out.println("Val of longitude is: " + 
        itr.getCenter().getLongitude() + "\n");
}

नोट: MyPojo[].classवह वर्ग है जिसमें जैसन गुण के गेटटर और सेटर हैं।

परिणाम:

Val of name is: New York
Val of number is: 732921
Val of latitude is: 38.895111
Val of longitude is: -77.036667
Val of name is: San Francisco
Val of number is: 298732
Val of latitude is: 37.783333
Val of longitude is: -122.416667

1
यह समस्या मुझे कई दिनों से है, कोई अन्य उत्तर समझ में नहीं आ रहा है। किसी और के लिए भी यही त्रुटि है। यह ध्यान देने योग्य है कि यदि आपके JSON में कई ऑब्जेक्ट हैं, तो आपको कई ऑब्जेक्ट वापस करने होंगे। मैं MyObject लौट रहा था, जहाँ मुझे MyObject लौटाना चाहिए था []
अरिया

8

जैसा कि कहा गया है, JsonMappingException: out of START_ARRAY tokenअपवाद जैक्सन ऑब्जेक्ट मैपर द्वारा फेंका गया है क्योंकि यह उम्मीद कर रहा है Object {}जबकि यह एक Array [{}]प्रतिक्रिया में मिला ।

एक सरल समाधान के getLocationsसाथ विधि की जगह ले सकता है :

public static List<Location> getLocations(InputStream inputStream) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        TypeReference<List<Location>> typeReference = new TypeReference<>() {};
        return objectMapper.readValue(inputStream, typeReference);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

दूसरी ओर, यदि आपके पास कोई पूजो नहीं है, तो आप Locationउपयोग कर सकते हैं:

TypeReference<List<Map<String, Object>>> typeReference = new TypeReference<>() {};
return objectMapper.readValue(inputStream, typeReference);

1
इस वैकल्पिक कार्यान्वयन को साझा करने के लिए धन्यवाद। आप बता सकते हैं कि वहाँ उपयोग करने के साथ लाभ या नुकसान कर रहे हैं CollectionTypeबनाम TypeReference?
21

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