জসনম্যাপিংএক্সেপশন: 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;
}

জ্যাসন ফাইল থেকে সামগ্রীটি বিশ্লেষণের জন্য আমি জ্যাকসন ২.২.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 করতে পারে না [ লাইন: 5, কলাম: 25]
(রেফারেন্স চেইনের মাধ্যমে: com.example.Location ["কেন্দ্র"]]


আপনি যদি জ্যাকসন পার্সার দিয়ে পার্স করতে পারেন তবে আপনি জ্যাকসনটি কেন ব্যবহার করছেন
শশাঙ্ক আগরওয়াল

4
আপনার JSON স্ট্রিংটি ত্রুটিযুক্ত, প্রকারটি centerঅবৈধ অবজেক্টগুলির একটি অ্যারে। প্রতিস্থাপন করার চেষ্টা করুন [এবং ]সঙ্গে {এবং }প্রায় JSON স্ট্রিংকে মধ্যে longitudeএবং latitudeতাই তারা বস্তু হতে হবে।
কাতোনা

1
@ ক্যাটোনা আপনাকে ধন্যবাদ আপনি কি দয়া করে আপনার মন্তব্যকে উত্তরে রূপান্তর করতে পারেন যাতে আমি প্রশ্নটি বন্ধ করতে পারি ?!
জেজেডি

উত্তর:


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
আমার একই সমস্যা ছিল, তবে জ্যাকসন ২.6.৩ ভিতে পাগলটি ছিল একেবারে আলাদা পাগল ত্রুটি, এবং ২.৯.৮ ভি দিয়ে সমস্ত কিছু কাজ করেছিল। এটি হতাশ, সুতরাং এই সিরিয়ালাইজেশন ত্রুটিগুলি তাই বিরক্তিকর।
brebDev

114

JsonMappingException: out of START_ARRAY tokenব্যতিক্রমটিকে জ্যাকসন অবজেক্ট ম্যাপার দ্বারা ছুঁড়ে দেওয়া হয়েছে কারণ এটি প্রত্যাশায় একটি প্রতিক্রিয়া Object {}পেয়েছে anArray [{}]

এটি প্রতিস্থাপনের মাধ্যমে সমাধান করা যেতে পারে ObjectObject[] জন্য যুক্তির মাধ্যমেgeForObject("url",Object[].class) । তথ্যসূত্র:

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

9

আমি JSONLint.com থেকে জসন যাচাইকরণ এবং তারপরে, এটি সংশোধন করার হিসাবে এই সমস্যার সমাধান করেছি। এবং এটি একই জন্য কোড।

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
এটি বেশ কয়েকদিন ধরে যে সমস্যাটি দেখছিলাম তা ঠিক করেছে, অন্য কোনও উত্তরই বোঝায় না। অন্য কারও জন্য একই ত্রুটি রয়েছে। এটি লক্ষণীয় যে আপনার জেএসএনের যদি একাধিক অবজেক্ট থাকে তবে আপনাকে একাধিক অবজেক্ট ফেরত পাঠানো দরকার। আমি MyObject, যেখানে আমি উচিত ছিল MyObject [] ফেরার হয়েছে ফেরার হয়েছে
Aaria

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?
জেজেডি

1
TypeReferenceবাক্য গঠনটি অন্যের চেয়ে অনেক কম। নিশ্চিত নয়, যদি কিছু ক্ষেত্রে মুছে ফেলা সম্পর্কিত কোনও পাল্টা ইঙ্গিতও হতে পারে ... তবে আমার বিশ্বে TypeReferenceব্যবহার এবং বোঝার পক্ষে সহজ।
ফ্রিডেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.