Java解析简单JSON字符串提取键值对存入内存表问题排查
问题背景
需要从简单JSON字符串中提取键值对存入内存表格,待解析的JSON字符串如下:
{"nom":"BRUN","prenom":"Albert","date_naiss":"10-10-1960","adr_email":"abrun@gmail.com","titre":"Mr","sexe":"F"}
原有实现无法正确遍历键值对,问题代码如下:
public static ArrayHandler jsonSimpleObjectToTab(String data) throws ParseException { if( data instanceof String) { final var jsonParser = new JSONParser(); final var object = jsonParser.parse(data); final var array = new JSONArray(); array.put(object); final var handler = new ArrayHandler("BW_funct_Struct"); for( KeyValuePair element : array) { handler.addCell(element); Log.warn(handler); } return handler; } else { throw new IllegalArgumentException("jsonSimpleObjectToTab: do not support complex object" + data + "to Tab"); } }
问题根因
- 解析得到的
object是JSONObject类型,本身存储了JSON的所有键值对。你将整个对象作为单个元素放入JSONArray,遍历时只会拿到这一个完整对象,无法获取内部的键值对。 - 方法入参已经声明为
String类型,额外做instanceof判断属于冗余逻辑。
修复方案
不需要额外包装JSONArray,直接遍历JSONObject内部的键值对即可,修复后代码:
public static ArrayHandler jsonSimpleObjectToTab(String data) throws ParseException { if (data == null || data.isBlank()) { throw new IllegalArgumentException("Input json string cannot be empty"); } final JSONParser jsonParser = new JSONParser(); final JSONObject jsonObj = (JSONObject) jsonParser.parse(data); final ArrayHandler handler = new ArrayHandler("BW_funct_Struct"); // 直接遍历JSON对象的所有键值对 for (Map.Entry<String, Object> entry : jsonObj.entrySet()) { KeyValuePair element = new KeyValuePair(entry.getKey(), entry.getValue()); handler.addCell(element); Log.warn("Added key-value pair: key={}, value={}", entry.getKey(), entry.getValue()); } return handler; }
补充说明
- 如果你使用的是json-simple类库,
JSONObject本身继承自HashMap,直接遍历entrySet()即可拿到所有键和对应的值。 - 如果后续需要处理最外层为数组的JSON(
[]包裹的多对象结构),再判断解析结果为JSONArray类型后遍历数组元素即可,当前单对象场景不需要构造数组。
内容的提问来源于stack exchange,提问作者IphoneVore
相关产品推荐
相关产品推荐

