如何将JSONObject转为LinkedHashMap列表并构建HashMap<Integer, CustomObject>
问题:将JSONObject转换为List并构建目标Map
我通过以下代码获取JSONObject:
JSONObject jsonObject = restTemplate().getForObject(endPointUrl , JSONObject.class)
对应的JSON结构为:
{"content":[{"id":12345,"code":"89879","Option1":"Raw","Option2":"Pure","Option3":"Mix","pborrow":true}, {"id":34234,"code":"89877","Option1":"Pure","Option2":"Raw","Option3":"Raw","pborrow":true}, {"id":8876,"code":"534554","Option1":"Raw","Option2":"Mix","Option3":"Mix","pborrow":true} }]}
目标是将这个JSON转换成List<LinkedHashMap>,再遍历构建HashMap<Integer, CustomObject>——其中键是每条数据的code值(转为Integer类型),CustomObject由Option1、Option2、Option3的字段值构建。
之前尝试的转换代码报错:
List<Map> myJsonList = rootJsonObject.get("content") != null ? (List) ((LinkedHashMap)rootJsonObject.get("content")) : null;
正确的转换方案
方法1:直接安全类型转换
问题根源是错误地把content对应的JSON数组强转为LinkedHashMap,实际上content本身就是数组类型,直接转为List即可:
List<LinkedHashMap<String, Object>> myJsonList = null; if (jsonObject.containsKey("content")) { myJsonList = (List<LinkedHashMap<String, Object>>) jsonObject.get("content"); }
注:主流JSON解析库(如Jackson、Gson)默认会把JSON数组解析为List,JSON对象解析为LinkedHashMap,该转换符合默认解析规则。
方法2:字段过滤式转换(更安全)
如果想直接过滤掉不需要的字段(如id、pborrow),可以先转为JSONArray再逐个处理:
List<LinkedHashMap<String, Object>> myJsonList = new ArrayList<>(); if (jsonObject.containsKey("content")) { JSONArray contentArray = jsonObject.getJSONArray("content"); for (int i = 0; i < contentArray.length(); i++) { JSONObject itemObj = contentArray.getJSONObject(i); LinkedHashMap<String, Object> itemMap = new LinkedHashMap<>(); // 只提取需要的4个字段 itemMap.put("code", itemObj.getString("code")); itemMap.put("Option1", itemObj.getString("Option1")); itemMap.put("Option2", itemObj.getString("Option2")); itemMap.put("Option3", itemObj.getString("Option3")); myJsonList.add(itemMap); } }
后续构建responseMap的优化代码
拿到正确的myJsonList后,可使用增强for循环简化构建逻辑:
HashMap<Integer, CustomObject> responseMap = new HashMap<>(); for (LinkedHashMap<String, Object> objectMap : myJsonList) { String option1 = (String) objectMap.get("Option1"); String option2 = (String) objectMap.get("Option2"); String option3 = (String) objectMap.get("Option3"); Integer code = Integer.parseInt((String) objectMap.get("code")); responseMap.put(code, new CustomObject(code, option1, option2, option3)); }
内容的提问来源于stack exchange,提问作者Anuj
相关产品推荐
相关产品推荐

