Ошибка преобразования строки JSON в карту в Java с использованием Jackson - PullRequest
5 голосов
/ 16 февраля 2011

У меня есть этот маленький фрагмент кода, и я пытаюсь преобразовать строку JSON в карту.

String json = "[{'code':':)','img':'<img src=/faccine/sorriso.gif>'}]";
ObjectMapper mapper = new ObjectMapper();
Map<String,String> userData = mapper.readValue(json,new TypeReference<HashMap<String,String>>() { });

Но он возвращает следующую ошибку:

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.HashMap out of START_ARRAY token
 at [Source: java.io.StringReader@1b1756a4; line: 1, column: 1]
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:198)
    at org.codehaus.jackson.map.deser.MapDeserializer.deserialize(MapDeserializer.java:151)
    at org.codehaus.jackson.map.deser.MapDeserializer.deserialize(MapDeserializer.java:25)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2131)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1402)
    at CodeSnippet_19.run(CodeSnippet_19.java:13)
    at org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain1.eval(ScrapbookMain1.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain.evalLoop(ScrapbookMain.java:54)
    at org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain.main(ScrapbookMain.java:35)

Что я делаю не так?

Ответы [ 2 ]

6 голосов
/ 16 февраля 2011

Из того, что я помню, Джексон используется для преобразования json в java-классы - он, вероятно, ожидает, что первый объект читается как карта, как

String json = "{'code':':)','img':'<img src=/faccine/sorriso.gif>'}";
4 голосов
/ 18 февраля 2011

Справа: вы просите Джексона отобразить массив JSON в объект;нет очевидного способа сделать это.Итак, ответ tofarr верен.

Но если вы хотите получить список или массив, вы можете легко добиться этого с помощью:

List<?> list = mapper.readValue(json, List.class);

или с полной ссылкой на тип;опционально в этом случае, потому что вам нужны списки, карты и строки.

...