2013-10-12 6 views
32

Учитывая следующий .json файл:JsonMappingException: из START_ARRAY лексема

[ 
    { 
     "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 я использую Jackson 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 из START_ARRAY в [Источник: [email protected]; Линия: 5, колонок: 25]
(через эталонную цепь: com.example.Location [ "центр"])

+0

почему вы используете jackson, если вы можете просто проанализировать его с помощью json parser –

+3

Ваша строка JSON неверна, тип 'center' - это массив недопустимых объектов.Попытайтесь заменить '' '' '' '' '' '' '' '' '' в строке JSON вокруг 'longitude' и' широты', чтобы они были объектами. – Katona

+0

@Katona спасибо. Не могли бы вы преобразовать свой комментарий в ответ, чтобы я мог закрыть вопрос ?! – JJD

ответ

31

Ваша строка 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 
      } 
    } 
] 
33

JsonMappingException: out of START_ARRAY token исключение Джексона объекта картографа, как он ожидает Object {} в то время как он нашел Array [{}] в ответ.

Это можно решить, заменив Object на Object[] в аргументе для geForObject("url",Object[].class). Ссылки:

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

спасибо, основная, но необходимая информация –

+0

Это сработало для меня! У меня был Product.class, и я просто добавил Product []. Class. Бам! За работой. Спасибо Абхиджит! – Jonathan

1

Как уже говорилось, 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; 
} 

С другой стороны, если вы не имеете POJO как Location, вы можете использовать:

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

Спасибо, что поделились этой альтернативной реализацией. Можете ли вы сказать, есть ли преимущества или недостатки при использовании 'CollectionType' и' TypeReference'? – JJD

+0

Синтаксис 'TypeReference' намного короче, чем другой. Не уверен, если в некоторых случаях может быть встречная индикация, связанная с стиранием типа ... но в моем мире «TypeReference» просто проще использовать и понимать. – freedev

Смежные вопросы