将 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<String, Object>
被解组为 HashMap<String, LinkedHashMap>
。
将内部 LinkedHashMaps 转换回正确的对象
ObjectMapper mapper = new ObjectMapper();
Class clazz = (Class) Class.forName(classType);
MyOwnObject value = mapper.convertValue(value, clazz);
为了防止必须提前知道“classType”,我在编组期间强制添加了一个额外的 Map,其中包含 <key, classNameString>
对。所以在解组时,可以动态提取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<String, Object>
的最佳方法是:
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<String,Object>
。
pom.xml
中使用的Maven依赖:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
【讨论】:
以上是关于将 JSONObject 转换为 Map的主要内容,如果未能解决你的问题,请参考以下文章
Gson:直接将String转换为JsonObject(无POJO)
如何将 LinkedTreeMap 转换为 gson JsonObject
如何将 JsonObject 转换为类模型 kotlin android
如何将我的 JsonObject (com.google.gson.JsonObject) 转换为 GenericRecord (org.apache.avro.generic.GenericReco