Проблема при попытке использовать Джексона в Java - PullRequest
19 голосов
/ 09 декабря 2010

Я пытаюсь использовать Джексона для преобразования некоторых данных JSON в объекты Java, точнее, список объектов, но я получаю эту ошибку:

org.codehaus.jackson.map.JsonMappingException: Невозможно десериализовать экземпляр entitylayer. Детализация вне токена START_ARRAY

это код:

 ObjectMapper mapper = new ObjectMapper(); 
 List<Detail> lcd = (List<Detail>) mapper.readValue(ld, Detail.class);

ld - это список в формате Json, это часть, которая заставляет меня смущаться в уроке Джексона . что означает новый файл ("user.json") ? Я предположил, что это была строка в формате json, которую я хотел преобразовать, поэтому я использовал ld .

Надеюсь, вы поможете мне с этим

Ответы [ 4 ]

19 голосов
/ 09 декабря 2010

Из учебника, который вы связали (другие Коллекции работают так же):

Так что, если вы хотите связать данные в карту, вам нужно будет использовать:

Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });

, где TypeReference требуется только для передачи определения универсального типа (в данном случае через любой внутренний класс): важная часть ->, которая определяет тип для привязки.

Если вы этого не сделаете (и просто передадите Map.class), вызов будет эквивалентен привязке к Map (то есть «нетипизированной» Map), как описано выше.

Edit:

Если вы настаиваете, чтобы вас кормили ложкой:

List<Detail> lcd = mapper.readValue(ld, new TypeReference<List<Detail>>() {});
12 голосов
/ 10 декабря 2010

Как альтернативная стратегия, работать с массивами немного удобнее, потому что вы можете легко указать тип.В качестве альтернативы вы также можете сделать это:

Detail[] details = mapper.readValue(ld, Detail[].class);

Массивы часто используются недостаточно, по крайней мере, при работе с Джексоном.Пока вам не нужно слишком сильно изменять результаты, они очень удобны в использовании, поскольку типы хорошо содержатся без необходимости использования обобщений (и, как результат, безопасность типов является сильной; это не просто пух компилятора).

0 голосов
/ 13 июня 2013

Всякий раз, когда вы получаете эту ошибку, сначала проверьте, является ли строка JSON, в которую вы пытаетесь преобразовать, правильной строкой JSON.Если вы попытаетесь создать собственную строку JSON для локального тестирования вашего кода, вы получите эту ошибку.

0 голосов
/ 08 февраля 2013

В качестве альтернативы вы можете самостоятельно проанализировать JSON и создать любые POJO, которые вы хотите создать. Я сделал это, чтобы преобразовать JSON в JAXB.

См. Раздел «Пример потокового API» по адресу http://wiki.fasterxml.com/JacksonInFiveMinutes

Это проще, чем вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...