Convert JSONObject to Map
我有一个
我可以在json.org或
使用来自http://json.org/的Jackson(http://jackson.codehaus.org/)
如果您在使用Jackson时遇到任何困难,则可以使用Gson()(com.google.gson)库。
1 |
这对我有用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public static Map<String, Object> toMap(JSONObject jsonobj) throws JSONException { Map<String, Object> map = new HashMap<String, Object>(); Iterator<String> 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<Object> toList(JSONArray array) throws JSONException { List<Object> list = new ArrayList<Object>(); 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; } |
大部分问题来自以下问题:如何使用迭代器java将JSONObject转换为其所有键的新Map
注意上述解决方案(来自A Paul):
该解决方案不起作用,因为它没有重新构造HashMap
原因是因为在解组期间,每个对象(以LinkedHashMap的形式编组的JSON)均按原样使用,它采用了一对一的LinkedHashMap(而不是将LinkedHashMap转换回其正确的对象)。
如果您有HashMap
1 2 3 4 | ObjectMapper mapper = new ObjectMapper(); TypeFactory typeFactory = mapper.getTypeFactory(); MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, MyOwnObject.class); HashMap<String, MyOwnObject> map = mapper.readValue(new StringReader(hashTable.toString()), mapType); |
将其转换为
1 |
发现这些问题可以通过使用解决
1 |
结果,原始问题可以通过两步收敛来解决:
通过使用bjectMapper#readValue()将JSON解组到对象-在其中将
将内部LinkedHashMaps转换回适当的对象
Class clazz = (Class) Class.forName(classType);
MyOwnObject value = mapper.convertValue(value, clazz);
为了防止必须事先知道'classType',在编组期间我强制执??行了一个额外的Map,其中包含