JsonMappingException: START_ARRAY jetonu bitti


113

Aşağıdaki .json dosyası göz önüne alındığında:

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

İçerdiği verileri temsil etmek için iki sınıf hazırladım:

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

...

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

.Json dosyasındaki içeriği ayrıştırmak için Jackson 2.2.x kullandım ve aşağıdaki yöntemi hazırladım:

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Özelliği dışarıda bıraktığım sürece tüm içerik ayrıştırılabilir. Ancak, coğrafi koordinatları ayrıştırmaya çalıştığımda aşağıdaki hata mesajıyla karşılaşıyorum:

com.fasterxml.jackson.databind.JsonMappingException:
[Source: android.content.res.AssetManager$AssetInputStream@416a5850; satır: 5, sütun: 25]
(referans zinciri aracılığıyla: com.example.Location ["merkez"])


json ayrıştırıcı ile ayrıştırabiliyorsanız neden jackson kullanıyorsunuz
Shashank Agarwal

4
JSON dizeniz yanlış biçimlendirilmiş, türü centergeçersiz nesnelerden oluşan bir dizidir. Yerine deneyin [ve ]birlikte {ve }çevresinde JSON dizesinde longitudeve latitudeonlar nesneleri olacak böylece.
Katona

1
@Katona Teşekkürler. Soruyu kapatabilmem için lütfen yorumunuzu cevaba dönüştürür müsünüz ?!
2013,

Yanıtlar:


76

JSON dizeniz yanlış biçimlendirilmiş: türü center, geçersiz nesnelerden oluşan bir dizidir. Değiştir [ve ]ile {ve }çevresinde JSON dizesinde longitudeve latitudeonlar nesneleri olacak böylece:

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

2
Benim sahip olduğum problemin aynısı, ancak Jackson 2.6.3v'de tamamen farklı bir çılgın hata olduğu ve 2.9.8v ile her şey işe yaradığı için çılgınca. Kahretsin, bu yüzden bu serileştirme hataları çok can sıkıcı.
brebDev

115

JsonMappingException: out of START_ARRAY tokenJackson nesne eşleştiricisi tarafından bir istisna beklerken , yanıt olarak Object {}bulduğu için bir istisna atılır Array [{}].

Bu , argümanında Objectile değiştirilerek çözülebilir . Referanslar:Object[]geForObject("url",Object[].class)

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

9

Bu sorunu JSONLint.com'dan json'u doğrulamak ve ardından düzeltmek olarak sıraladım. Ve bu aynı şeyin kodudur.

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");
}

Not: MyPojo[].classjson özelliklerinin alıcı ve ayarlayıcısına sahip sınıftır.

Sonuç:

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
Bu günlerdir yaşadığım sorunu çözdü, başka hiçbir cevap mantıklı gelmedi. Aynı hatayı yapan başkaları için. JSON'nuzun içinde birden çok nesne varsa, birden çok nesneyi döndürmeniz gerektiğini belirtmek gerekir. MyObject'i iade etmem gereken yere geri dönüyordum []
Aaria,

8

Gibi, söz konusu JsonMappingException: out of START_ARRAY tokenbir bekliyor olarak istisna Jackson nesne haritacının atılır Object {}bir tespit ise Array [{}]cevaben.

Daha basit bir çözüm, yöntemi aşağıdakilerle değiştirmek olabilir 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;
}

Öte yandan, beğenen bir pojo'unuz Locationyoksa şunları kullanabilirsiniz:

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

1
Bu alternatif uygulamayı paylaştığınız için teşekkür ederiz. Kullanarak avantajları veya dezavantajları vardır söyleyebilir misin CollectionTypeVS. TypeReference?
JJD

1
TypeReferencesözdizimi diğerinden çok daha kısadır. Emin değilim, bazı durumlarda tip silme ile ilgili bir karşı gösterge olabilir mi ... ama benim dünyamda TypeReferencekullanımı ve anlaşılması daha kolay.
freedev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.