小玩意 - JSON 快速克隆的另一种形式

Posted 放羊的牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小玩意 - JSON 快速克隆的另一种形式相关的知识,希望对你有一定的参考价值。

  • 起始节点 - 数组“[]”

 

  •  起始节点 - 对象“”

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
* @author Lux Sun
* @date 2021/12/28
*/
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]

以上是关于小玩意 - JSON 快速克隆的另一种形式的主要内容,如果未能解决你的问题,请参考以下文章

从 netbeans 中的另一种形式在表中添加行

闭包的另一种形式 ? (说法待确定)

克隆一个 JavaScript 对象? [复制]

“ 模块化 modular ” “点”的另一种表现形式,将复杂的问题分解

接口测试的另一种方式 – 接口测试平台

接口测试的另一种方式 – 接口测试平台