2013-10-12 13 views
32

Biorąc pod uwagę następujący plik .json:JsonMappingException: z START_ARRAY żeton

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

Przygotowałem dwie klasy do reprezentowania zawarte dane:

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

...

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

W celu przeanalizowania zawartości pliku .json używam Jackson 2.2.x i przygotowałem następującą metodę:

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

Dopóki nie pominiemy właściwości center, można przeanalizować całą zawartość. Jednak, gdy próbuję analizować współrzędnych geograficznych I skończyć z następującym komunikatem o błędzie:

com.fasterxml.jackson.databind.JsonMappingException: Nie można deserializować instancję
com.example.GeoPoint z START_ARRAY token at [Źródło: [email protected]; Linia: 5, kolumna 25]
(za pośrednictwem sieci referencyjnej: com.example.Location [ "środek"])

+0

dlaczego ty używasz jacksona, jeśli możesz po prostu sparsować go parserem json –

+3

Twój ciąg JSON jest zniekształcony, typ 'center' jest tablicą nieprawidłowych obiektów.Spróbuj zamienić '[' i ']' na '{' i '}' w ciągu JSON wokół 'longitude' i' szerokość geograficzną', aby były obiektami. – Katona

+0

@Katona Dziękuję. Czy możesz zmienić swój komentarz w odpowiedź, aby zamknąć pytanie ?! – JJD

Odpowiedz

31

Twój JSON łańcuch jest niepoprawny: typ center jest tablicą nieprawidłowych obiektów. Wymienić [ i ] z { i } w ciągu JSON wokół longitude i latitude więc będą one obiektów:

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

JsonMappingException: out of START_ARRAY token jest wyjątek przez Jackson obiektu odwzorowującym jak to oczekiwał Object {} natomiast znalazł Array [{}] w odpowiedzi.

Można to rozwiązać, zamieniając Object na Object[] w argumencie na geForObject("url",Object[].class). Odniesienia:

  1. Ref.1
  2. Ref.2
  3. Ref.3
+0

dziękuję, podstawowe, ale niezbędne informacje –

+0

To działało dla mnie! Miałem Product.class i właśnie dodałem Product []. Class. Bam! Pracujący. Dzięki Abhijeet! – Jonathan

1

jak wspomniano, JsonMappingException: out of START_ARRAY token jest wyjątek Jacksona obiektu odwzorowujący jak to oczekując Object {} natomiast znalazł Array [{}] w reakcji.

Prostszym rozwiązaniem mogłoby być zastąpienie metody getLocations z:

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

Z drugiej strony, jeśli nie masz POJO jak Location, można użyć:

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

Dziękujemy za udostępnienie tej alternatywnej implementacji. Czy możesz stwierdzić, czy istnieją zalety lub wady przy użyciu 'CollectionType' vs.' TypeReference'? – JJD

+0

Składnia 'TypeReference' jest znacznie krótsza niż druga. Nie jestem pewien, czy w niektórych przypadkach może istnieć przeciwwskazanie związane z wymazaniem typu ... ale w moim świecie "TypeReference" jest po prostu łatwiejszy w użyciu i zrozumieniu. – freedev

Powiązane problemy