Java:将JSON结构反序列化为Map

我有一个JSON字符串,我想转换为Map结构,其中Object是基本类型的Java版本(即String,Int,Double),Map。 或者一份清单。

我用于测试的示例字符串是:

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

这应该是一个案例数组,每个案例都有一个文档数组,每个文档都有一个文件数组,每个文件都有一个名称

我试过Google的Gson,但是

 Gson gson = new Gson(); List<Map> 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 

我试过jackson,但是

 List<Map> results = (List<Map>) 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] 

你有什么建议吗? 要么是如何正确使用上述任何一种,要么是为了给我我想要的另一种解析器?

干杯

鉴于您的描述,听起来您的定义不匹配。 它听起来应该是这样的: List>>

这是一个更多的手册,但看看这里:

http://json.org/java/

这将为您提供一个比自己解析字符串更容易使用的JSONObject,但您仍然需要深入研究并手动构建地图。 有点半解决方案。

我偶然发现了同样的问题,我发现了一个简单的解决方案。 我发布了一个更明确的答案,以防它帮助其他人:

 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 } 

将此依赖项添加到项目中,如下所示:

  org.json json 20090211  

或者直接下载JAR:
http://repo1.maven.org/maven2/org/json/json/20090211/json-20090211.jar

我已经有了这个类(它是我们项目中其他东西的瞬态依赖)。 所以一定要检查它是否已经存在。 你也可能很幸运。

最简单的事情可能就是自己动手:使用类似GSON或者tapestry的JSONObject来构造你的json的java表示,然后只需遍历它并构建你喜欢的任何地图结构。