小玩意-json快速克隆的另一种形式(代码片段)

放羊的牧码 放羊的牧码     2022-12-01     148

关键词:

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

 

  •  起始节点 - 对象“”

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]

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

defgen_rand_data(tensor_arg):rand_func="randint":__gen_rand_randintfunc=rand_func[tensor_arg]returnfunc(tensor_arg)def__gen_rand_randint(arg):returnargprint(gen_rand_data("randint"))print(type(gen_rand_data("randint")))returnfunc(tensor_arg)实际返回的是"实例化"之后的返回值string类型... 查看详情

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

】从netbeans中的另一种形式在表中添加行【英文标题】:addingrowsinatablefromanotherforminnetbeans【发布时间】:2013-11-1508:31:15【问题描述】:我有这两种形式:NetBeans中的“时尚和鞋类”和“购物车”。第一个表单包含4个按钮。另一个... 查看详情

squid传统代理的另一形式----透明代理(代码片段)

构建透明代理安装squid支持透明模式squid透明代理本属于squid标准传统代理的一部分,本文特意将透明代理单独写出,是因为yum安装的版本中没有支持透明模式的模块。因此,支持透明代理的模块需要在手动编译安装时加入。tarzxv... 查看详情

shiro开发的另一种方式(代码片段)

    今天在学习shiro的时候使用另一种shiro验证的方式。  总体的思路是:     (1)先在自己的方法中进行身份的验证以及给出提示信息。     (2)当验证成功之后到Shiro中认证以及授权一下即可。当然,在自己验... 查看详情

nodejs中模块成员导出的另一种方式![module.exports](代码片段)

NodeJS中模块成员导出的另一种方式!栗子:还是先创建两个JS文件【文件名随便取】module.exports.jsconstgreeting=name=>return`hello$name!`module.exports.greeting=greeting;require.jsconsta=require(\'./module.exports\');console.log(a.g 查看详情

创建线程的另一种方法:通过类创建(28-1)(代码片段)

 能够让CPU运行起来的就是线程!importthreadingimporttimeclassMyThread(threading.Thread):  def__init__(self,num):    threading.Thread.__init__(self)    self.num=num    defrun(self):    #定义每个线程要执行的函数    print("r 查看详情

javaviewholder的另一种写法。只需一个类通用好了,适配器里不用额外写...(代码片段)

查看详情

在>=win1017134枚举驱动的另一种方法(代码片段)

首先枚举驱动的方法很多,这里不做过多介绍,此文仅简单说明x64系统,x86结构和偏移需重新收集.在17134版本中,MI_SYSTEM_IMAGE_STATE结构新增了一个成员即以下的最后一个成员ImageTree,此树保存驱动LdrSection题外话:MI_SYSTEM_IMAGE_STATE是_MI_SYST... 查看详情

spring监听的另一种写法(代码片段)

@EventListener在哪里解析的?org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons   org.springframework.context.event.EventListenerMethodProcessor#processBean遍历所有bean里面的所有加了@EventListener注解的方法找到后开... 查看详情

jwt使用的另一种声音(代码片段)

讲真,别再使用JWT了! 把本应该session中保存的数据去除敏感字段保留到客户端  在Web应用中,使用JWT替代session并不是个好主意适合JWT的使用场景抱歉,当了回标题党。我并不否认JWT的价值,只是它经常被误用。什么... 查看详情

如何从另一种形式调用多个方法c#(代码片段)

...“UpdateTheme”,它改变了表单的背景颜色。我希望能够从另一种形式调用所有这些方法。我尝试使用“UpdateTheme”方法创建一个基本表单,然后让所有其他表单继承自基本表单,但我不知道如何/是否可以从单独的“设置”调用派... 查看详情

windows下硬件信息的另一种方式获取(代码片段)

通过命令方式TCHARszFetCmd[]=_T("wmicbaseboardgetserialnumber");可以有:查找主板厂商和型号wmicBaseBoardgetManufacturerwmicBaseBoardgetProduct先决条件:a.启动WindowsManagementInstrumentation服务,开放TCP135端口。b.本地安全策略的“网络访问:本地... 查看详情

stm32f103按键操作的另一种实现——状态机(代码片段)

#ifndef_KEY_H_#define_KEY_H_#include"HAL_gpio.h"//换成STM32F103对应的GPIO库#include"type.h"//type.h主要是一些类型的重命名#defineKEY_UP_GRPGPIOA#defineKEY_UP_IDXGPIO_Pin_9#defineKEY_UP_IS_DOWN()GPIO_Rea 查看详情

mycat登录报错host'xxx'isblockedbecauseofmanyconnectionerrors的另一种解决思路(代码片段)

报错时机使用了mycat,而不是单纯使用了mysql。报错信息ERROR1129(HY000):Host‘1.23.22.18‘isblockedbecauseofmanyconnectionerrors;unblockwith‘mysqladminflush-hosts‘解决思路网上搜索一大把解决方法,大同小异,都是flushhost等等。比如2013年的cnblogs但... 查看详情

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

接口测试的另一种方式–接口测试平台文章目录[显示]搭建的初衷现状目前,基于我们组所需要测试的点,很大一部分都是跟接口相关的,不管是我们系统内部的接口还是第三方(外部系统)的接口。部分接口还涉及到对传输数据... 查看详情

单元测试框架处理多组数据的另一种写法:基于构造函数和超继承(代码片段)

众所周知,在单元测试框架中引入ddt,可以将一组数据分解为多组数据,从而实现一条数据对应一个测试用例。但是除此之外,有没有别的办法来实现这个目的呢?一.代码部分1.创建一个被测函数math_method.pyclassMethMethod():defadd_tes... 查看详情

sharedpreferences的另一种场景的用法

SharedPreferences的另一种场景的用法昨天,下班在家想做什么来着,然后想用SharedPreferences存点数据,但是不知道咋地突然想到,SharedPreferences是应用启动时一次性加到内存里的.适合少量的存储,多的话还是用数据库吧.实际项目中都是数... 查看详情

位运算的另一种姿势

...32}$个01串。 但是这之后好像就又存在一个问题。如何快速的 查看详情