将 JSONObject 转换为 Map

Posted

技术标签:

【中文标题】将 JSONObject 转换为 Map【英文标题】:Convert JSONObject to Map 【发布时间】:2014-02-27 23:29:30 【问题描述】:

我有一个 JSONObject,其中包含一些我想转换为 Map<String, Object> 的属性

有什么我可以从 json.org 或 ObjectMapper 使用的东西吗?

【问题讨论】:

为什么不能只使用 JSONObject? @Marco Cali 尝试使用 gson。它是一个用于在 java 中处理 json 字符串的谷歌库。它提供了简单的转换方法。 JSONObject 实际上是一张地图。如果您确实需要 Java Map,请遍历 JSONObject 并填充您的 Map,或者使用对 Java 类进行反序列化的 JSON 解析库。 (杰克逊,格森) 使用 Couchbase lite android 进行管理以填充文档很有用。 @Brian Roach:谢谢,这就是我所做的。 【参考方案1】:

使用来自http://json.org/ 的杰克逊 (https://github.com/FasterXML/jackson)

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

【讨论】:

@MarcoCalì 如果您使用的是 Jackson,您将不会需要使用 JSONObject,这正是您所要求的。 它已被删除 还有任何 LinkedHashMap 方式? 据我所知,@Manoranjan 的答案是这里唯一正确的答案,即使通过字符串序列化并通过 GSON 返回地图似乎并不理想。不幸的是 JSONObject 可以将 Map 作为输入,但不能生成 Map 作为输出。【参考方案2】:

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

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

如果您有一个 HashMap 则可以进行适当的解组 - 请参见以下示例:

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);

【讨论】:

【参考方案3】:

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

ObjectMapper#convertValue(Object fromValue, Class<T> toValueType)

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

    使用 bjectMapper#readValue() 将 JSON 解组回一个对象 - 其中 Map&lt;String, Object&gt; 被解组为 HashMap&lt;String, LinkedHashMap&gt;

    将内部 LinkedHashMaps 转换回正确的对象

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

为了防止必须提前知道“classType”,我在编组期间强制添加了一个额外的 Map,其中包含 &lt;key, classNameString&gt; 对。所以在解组时,可以动态提取classType。

【讨论】:

【参考方案4】:

这对我有用:

    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;

大部分来自这个问题:How to convert JSONObject to new Map for all its keys using iterator java

【讨论】:

这是最好的解决方案,无需添加额外的解析库 谢谢@ir2pid。我尝试了所有其他方法,但无法让它们发挥作用。【参考方案5】:

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

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

【讨论】:

我正在使用 gson 2.8.6 预览版,您不再需要“yourJsonObject.toString()”,只需“yourJsonObject” 感谢您的信息:)【参考方案6】:

将其转换为HashMap&lt;String, Object&gt; 的最佳方法是:

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

【讨论】:

【参考方案7】:

20160810 转发的 org.json:json 工件的版本包含 JSONObject.toMap() 方法,根据 release history on GitHub。

toMap() 方法可用here 并且很容易适应:

public Map<String, Object> toMap() 
    Map<String, Object> results = new HashMap<String, Object>();
    for (Entry<String, Object> entry : this.entrySet()) 
        Object value;
        if (entry.getValue() == null || NULL.equals(entry.getValue())) 
            value = null;
         else if (entry.getValue() instanceof JSONObject) 
            value = ((JSONObject) entry.getValue()).toMap();
         else if (entry.getValue() instanceof JSONArray) 
            value = ((JSONArray) entry.getValue()).toList();
         else 
            value = entry.getValue();
        
        results.put(entry.getKey(), value);
    
    return results;

【讨论】:

【参考方案8】:

JSONObject 有一个方法 toMap,它返回 Map&lt;String,Object&gt;

pom.xml中使用的Maven依赖:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20210307</version>
</dependency>

【讨论】:

以上是关于将 JSONObject 转换为 Map的主要内容,如果未能解决你的问题,请参考以下文章

Gson:直接将String转换为JsonObject(无POJO)

如何将 LinkedTreeMap 转换为 gson JsonObject

如何使用 gson 库将字符串转换为 JsonObject

将JSONObject转换为Map

如何将 JsonObject 转换为类模型 kotlin android

如何将我的 JsonObject (com.google.gson.JsonObject) 转换为 GenericRecord (org.apache.avro.generic.GenericReco