【问题标题】:Convert JSONObject to Map将 JSONObject 转换为 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:谢谢,这就是我所做的。

标签: java json map jsonobject


【解决方案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)
    

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

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

    2. 将内部 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>
          

          【讨论】:

            猜你喜欢
            • 2014-12-09
            • 1970-01-01
            • 1970-01-01
            • 2019-04-12
            • 1970-01-01
            • 2016-06-05
            • 2014-04-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多