关于java:将JSONObject转换为Map

Convert JSONObject to Map

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

我可以在json.org或ObjectMapper中使用某些东西吗?


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

1
2
HashMap<String,Object> result =
        new ObjectMapper().readValue(<JSON_OBJECT>, HashMap.class);


如果您在使用Jackson时遇到任何困难,则可以使用Gson()(com.google.gson)库。

1
HashMap<String, Object> yourHashMap = new Gson().fromJson(yourJsonObject.toString(), HashMap.class);


这对我有用:

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 -而是创建了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);

将其转换为HashMap的最佳方法是:

1
HashMap<String, Object> result = new ObjectMapper().readValue(jsonString, new TypeReference<Map<String, Object>>(){}));

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

1
ObjectMapper#convertValue(Object fromValue, Class< T > 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。