将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
其中大部分来自这个问题: 如何使用iterator java将JSONObject转换为其所有键的新Map
如果您发现使用Jackson有任何困难,可以使用Gson()(com.google.gson)库。
HashMap yourHashMap = new Gson().fromJson(yourJsonObject.toString(), HashMap.class);
注意上面的解决方案(来自A Paul):解决方案不起作用,因为它不会重建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)
因此,原始问题可以通过两步收敛来解决:
-
通过使用bjectMapper #readValue()将JSON转换回一个对象 – 其中
Map
被解组为HashMap
。 -
将内部LinkedHashMaps转换回适当的对象
ObjectMapper mapper = new ObjectMapper(); Class clazz = (Class) Class.forName(classType); MyOwnObject value = mapper.convertValue(value, clazz);
为了防止’classType’必须提前知道,我在编组期间强制添加了一个额外的Map,其中包含
对。 因此,在解组时,可以动态提取classType。