我有一个 JSONObject的一些属性,我想转换成一个 Map<String, Object>
JSONObject
Map<String, Object>
我可以从 json.org 或 ObjectMapper中使用什么内容吗?
ObjectMapper
使用来自 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)
因此,最初的问题可以通过两步转换来解决:
通过使用 bjectMapper # readValue ()将 JSON 解组回一个对象,其中 Map<String, Object>被解组为 HashMap<String, LinkedHashMap>。
HashMap<String, LinkedHashMap>
将内部 LinkedHashMaps 转换回正确的对象
ObjectMapper 映射器 = 新的 ObjectMapper () ; Class clazz = (Class) Class.forName (classType) ; MyOwnObject value = mapper.ConvertValue (value,clazz) ;
为了防止必须事先知道“ classType”,我在编组时强制添加了一个额外的 Map,其中包含 <key, classNameString>对。因此,在解组时,可以动态提取 classType。
<key, classNameString>
这就是对我有效的方法:
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>
HashMap<String, Object> result = new ObjectMapper().readValue(jsonString, new TypeReference<Map<String, Object>>(){}));
JSONObject有一个返回 Map<String,Object>的方法 toMap。
Map<String,Object>
toMap
pom.xml中使用的 Maven 依赖项:
pom.xml
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>current-version</version> </dependency>
你可以找到 current-version 给你。
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());