将 JSONObject 转换为 Map

我有一个 JSONObject的一些属性,我想转换成一个 Map<String, Object>

我可以从 json.org 或 ObjectMapper中使用什么内容吗?

190903 次浏览

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

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

上述解决方案的注意事项(来自 A Paul) : 这个解决方案不起作用,因为它不会重新构造回一个 HashMap < String,Object > ,而是创建一个 HashMap < String,LinkedHashMap > 。

原因是在解组过程中,每个对象(JSON 编组为一个 LinkedHashMap)都按原样使用,它以1对1的方式使用 LinkedHashMap (而不是将 LinkedHashMap 转换回其适当的对象)。

如果你有一个 HashMap < String,MyOwnObject > ,那么正确的解组是可能的-参见下面的例子:

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

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

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

因此,最初的问题可以通过两步转换来解决:

  1. 通过使用 bjectMapper # readValue ()将 JSON 解组回一个对象,其中 Map<String, Object>被解组为 HashMap<String, LinkedHashMap>

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

ObjectMapper 映射器 = 新的 ObjectMapper () ; Class clazz = (Class) Class.forName (classType) ; MyOwnObject value = mapper.ConvertValue (value,clazz) ;

为了防止必须事先知道“ classType”,我在编组时强制添加了一个额外的 Map,其中包含 <key, classNameString>对。因此,在解组时,可以动态提取 classType。

这就是对我有效的方法:

    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

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

//按照 Martin Meeser 的建议,将 yourJsonObject.toString ()更改为 yourJsonObject

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

将其转换为 HashMap<String, Object>的最佳方法是:

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

JSONObject有一个返回 Map<String,Object>的方法 toMap

pom.xml中使用的 Maven 依赖项:

<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>current-version</version>
</dependency>

你可以找到 current-version 给你

我在 Kotlin 就是这么做的:

mutableMapOf<String, Any>().apply {
jsonObj.keys().forEach { put(it, jsonObj[it]) }
}
import com.alibaba.fastjson.JSONObject;




Map<String, Object> map = new HashMap<String, Object>();


JSONObject rec = JSONObject.parseObject(<JSONString>);


map.put(rec.get("code").toString(), rec.get("value").toString());