将JSONObject转换为Map

我有一个JSONObject ,其中包含一些我想要转换为Map属性

有什么东西可以在json.org或ObjectMapper吗?

使用来自http://json.org/的 Jackson( http://jackson.codehaus.org/

 HashMap result = new ObjectMapper().readValue(, HashMap.class); 

这对我有用:

  public static Map toMap(JSONObject jsonobj) throws JSONException { Map map = new HashMap(); Iterator keys = jsonobj.keys(); while(keys.hasNext()) { String key = keys.next(); Object value = jsonobj.get(key); if (value instanceof JSONArray) { value = toList((JSONArray) value); } else if (value instanceof JSONObject) { value = toMap((JSONObject) value); } map.put(key, value); } return map; } public static List toList(JSONArray array) throws JSONException { List list = new ArrayList(); for(int i = 0; i < array.length(); i++) { Object value = array.get(i); if (value instanceof JSONArray) { value = toList((JSONArray) value); } else if (value instanceof JSONObject) { value = toMap((JSONObject) value); } list.add(value); } return list; } 

其中大部分来自这个问题: 如何使用iterator java将JSONObject转换为其所有键的新Map

如果您发现使用Jackson有任何困难,可以使用Gson()(com.google.gson)库。

 HashMap yourHashMap = new Gson().fromJson(yourJsonObject.toString(), HashMap.class); 

注意上面的解决方案(来自A Paul):解决方案不起作用,因为它不会重建HashMap – 而是创建一个HashMap

原因是因为在解组期间,每个对象(JSON编组为LinkedHashMap)按原样使用,它与LinkedHashMap进行1对1的对比(而不是将LinkedHashMap转换回其正确的对象)。

如果你有一个HashMap 那么可以进行适当的解组 – 参见下面的例子:

 ObjectMapper mapper = new ObjectMapper(); TypeFactory typeFactory = mapper.getTypeFactory(); MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, MyOwnObject.class); HashMap map = mapper.readValue(new StringReader(hashTable.toString()), mapType); 

发现这些问题可以通过使用来解决

 ObjectMapper#convertValue(Object fromValue, Class toValueType) 

因此,原始问题可以通过两步收敛来解决:

  1. 通过使用bjectMapper #readValue()将JSON转换回一个对象 – 其中Map被解组为HashMap

  2. 将内部LinkedHashMaps转换回适当的对象

ObjectMapper mapper = new ObjectMapper(); Class clazz = (Class) Class.forName(classType); MyOwnObject value = mapper.convertValue(value, clazz);

为了防止’classType’必须提前知道,我在编组期间强制添加了一个额外的Map,其中包含对。 因此,在解组时,可以动态提取classType。