Java: десериализация структуры JSON для отображения - PullRequest
2 голосов
/ 06 мая 2011

У меня есть строка JSON, которую я хочу преобразовать в структуру Map, где Object - это либо версия Java базового типа (т.е. String, Int, Double), либо Map.или Список.

Пример строки, которую я использую для своих тестов:

"{\"cases\":[{\"documents\":[{\"files\":[{\"name\":\"a.pdf\"}]}]}]}"

Это должно читаться как массив дел, каждый из которых имеет массив документов, каждый из которых имеетмассив файлов, каждый из которых имеет имя

Я попробовал Gson от Google, но

Gson gson = new Gson();
List<Map<String, Object>> results = gson.fromJson(dictString, List.class);

дает мне:

com.google.gson.JsonParseException: The JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@561777b1 failed to deserialize json object {"cases":[{"documents":[{"files":[{"name":"a.pdf"}]}]}]} given the type interface java.util.List

и я попробовал Джексона,но

List<Map<String, Object>> results = (List<Map<String, Object>>) new ObjectMapper().readValue(dictString, List.class);

дал мне:

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.List out of START_OBJECT token
 at [Source: java.io.StringReader@1c5aebd9; line: 1, column: 1]

Есть ли у вас какие-либо предложения?Или для того, как правильно использовать любой из вышеперечисленных, или для другого парсера, который дает мне то, что я хочу?

Cheers

Nik

Ответы [ 3 ]

1 голос
/ 12 июля 2012

Я наткнулся здесь на ту же проблему и нашел простое решение. Я выкладываю более четкий ответ на тот случай, если он кому-то поможет:

String jsonString = "{ \"first-name\" : \"John\" }";

//creates, essentially a wrapper for a HashMap containing your JSON dictionary
JSONObject genericMap = new JSONObject(jsonString);

//calls to "put" and "get" are delegated to an internal hashmap
String name = (String) genericMap.get("first-name");
assertEquals("John", name); //passes

genericMap.put("last-name", "Doe"); //add any object to the hashmap

//the put methods can be used fluidly
genericMap.put("weight", 150).put("height", "5'10").put("age", "32");

//finally, you can write it back out to JSON, easily
String newJson = genericMap.toString(4); //pretty-print with 4 spaces per tab
log.debug(newJson);

это печатает следующее:

{
    "age": "32",
    "first-name": "John",
    "height": "5'10",
    "last-name": "Doe",
    "weight": 150
}

Добавьте эту зависимость в ваш проект следующим образом:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

Или скачайте JAR напрямую:
http://repo1.maven.org/maven2/org/json/json/20090211/json-20090211.jar

У меня уже был доступен этот класс (это была временная зависимость чего-то еще в нашем проекте). Так что не забудьте проверить, если он уже там в первую очередь. Тебе тоже может повезти.

0 голосов
/ 06 мая 2011

Самым простым может быть сделать это самостоятельно: использовать что-то вроде GSON или JSONObject гобелена для создания java-представления вашего json, а затем просто выполнить итерацию по нему и построить любую структуру карты, какую пожелаете.

0 голосов
/ 06 мая 2011

Учитывая ваше описание, похоже, ваше определение не совпадает. Это звучит так, как будто должно быть что-то вроде: List<List<list<String>>>

Это немного больше руководства, но посмотрите здесь:

http://json.org/java/

Это даст вам JSONObject, который гораздо проще использовать, чем анализировать строку самостоятельно, но вам все равно придется углубиться в него и построить карту вручную. Вид пополам раствора.

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