Java使用JSONObject/JSONArray生成JSON多出map、myArrayList前缀如何移除
问题原因
你遇到的外层多余字段问题,本质是二次序列化导致的:
你使用org.json包下的JSONObject/JSONArray封装数据后,没有直接输出它们自身序列化后的JSON字符串,而是把这两个对象作为普通Java类,交给了Gson/Spring自带的序列化工具做二次序列化。序列化工具会读取这两个类的内部成员变量:
JSONObject内部用map字段存储键值对数据JSONArray内部用myArrayList字段存储数组元素
因此序列化后就会多出你看到的外层包装字段。
解决方案
方案1:直接返回原生集合类(最推荐)
你本身已经用HashMap存储对象数据,数组场景可以直接用ArrayList存储数据,完全不需要套一层JSONObject/JSONArray,直接返回原生集合即可,序列化工具会直接输出正常的JSON结构:
JSONObject部分修改:
// 原来的最后一行 // return new JSONObject(json); // 改为直接返回你构造的HashMap即可 return json;
JSONArray部分修改:
// 原来的JSONArray定义 // JSONArray jsonArray = new JSONArray(); // 改为用ArrayList存储 List<Object> jsonArray = new ArrayList<>(); arrayschema.keySet().forEach(it -> { if (arrayschema.get(it).toString().contains("type=string")) jsonArray.add("string"); else if (arrayschema.get(it).toString().contains("type=integer")) jsonArray.add(0); else if (arrayschema.get(it).toString().contains("type=number")) jsonArray.add(0.0); else if (arrayschema.get(it).toString().contains("type=boolean")) jsonArray.add(true); }); // 最后直接返回这个ArrayList即可 return jsonArray;
方案2:直接返回JSON字符串
如果一定要使用JSONObject/JSONArray,调用它们自带的toString()方法得到最终的JSON字符串后再返回,避免二次序列化:
// JSONObject场景 return new JSONObject(json).toString(); // JSONArray场景 return jsonArray.toString();
方案3:指定序列化适配规则(不推荐)
如果项目要求必须返回JSONObject/JSONArray类型对象,可给序列化工具(Gson/Fastjson等)添加这两个类的自定义序列化适配器,直接输出内部存储的数据,而非对象字段。
内容的提问来源于stack exchange,提问作者daniel sinaga
相关产品推荐
相关产品推荐

