JSON 快速克隆的另一种形式
作者:互联网
- 起始节点 - 数组“[]”
- 起始节点 - 对象“{}”
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; /** * @author 测试 * */ public class Test { public static String jsonObjStr = "{\"k.1\":\"123\",\"k.2\":{\"k.2.1\":10,\"k.2.2\":[1,2,3.4],\"key\":11}}"; public static String jsonArrStr = "[\"k.3.4\",{\"k.1\":\"123\",\"k.2\":{\"k.2.1\":10,\"k.2.2\":[1,2,3.4],\"key\":11}}]"; private Object parse(String jsonStr) { JSONObject jsonObj = new JSONObject(); JSONObject newJsonObj = new JSONObject(); Object obj = JSON.parse(jsonStr); if (obj instanceof JSONArray) { jsonObj.put("jsonList", obj); } else if (obj instanceof JSONObject) { jsonObj = (JSONObject) obj; } dfs(jsonObj, newJsonObj); if (newJsonObj.containsKey("jsonList")) { return newJsonObj.get("jsonList"); } return newJsonObj; } private void dfs(Object obj, Object newObj) { if (obj == null) { return; } if (obj instanceof JSONObject) { JSONObject jsonObject = (JSONObject) obj; JSONObject newJsonObject = (JSONObject) newObj; jsonObject.forEach((key, value) -> { // 避免“.”号本来就在 Key 当中, 具有业务含义 String newKey = key.replace(".", "#"); Object newValue = getNewValue(value); if (newValue == null) { newJsonObject.put(newKey, value); } else { newJsonObject.put(newKey, newValue); dfs(value, newJsonObject.get(newKey)); } }); } else if (obj instanceof JSONArray) { JSONArray jsonArray = (JSONArray) obj; JSONArray newJsonArray = (JSONArray) newObj; for (int i = 0; i < jsonArray.size(); i++) { Object newValue = getNewValue(jsonArray.get(i)); if (newValue == null) { newJsonArray.add(jsonArray.get(i)); } else { newJsonArray.add(newValue); dfs(jsonArray.get(i), newJsonArray.get(i)); } } } } private Object getNewValue(Object obj) { if (obj instanceof JSONObject) { return new JSONObject(); } else if (obj instanceof JSONArray) { return new JSONArray(); } return null; } public static void main(String[] args) { // Object result = new Test().parse(jsonObjStr); Object result = new Test().parse(jsonArrStr); System.out.println(JSON.toJSONString(result, SerializerFeature.WriteMapNullValue)); } }
- 输出
-
// 对象节点 {"k#1":"123","k#2":{"k#2#1":10,"k#2#2":[1,2,3.4],"key":11}} // 数组节点 ["k.3.4",{"k#1":"123","k#2":{"k#2#1":10,"k#2#2":[1,2,3.4],"key":11}}]
以上内容来源于百科书,可以关注我了解更多.
标签:obj,克隆,get,JSONArray,JSONObject,Object,JSON,return,快速 来源: https://www.cnblogs.com/sdjlq/p/16668439.html