递归解析Json,实现生成可视化Tree+快速获取JsonPath | 京东云技术团队

news2024/11/17 7:52:48

内部平台的一个小功能点的实现过程,分享给大家:

递归解析Json,可以实现生成可视化Tree+快速获取JsonPath

步骤:

1.利用JsonPath读取根,获取JsonObject

2.递归层次遍历JsonObjec,保存结点信息

3.利用zTree展示结点为可视化树,点击对应树的结点即可获取对应结点的JsonPath

1.利用JsonPath读取根,获取JsonObject

示例Json:

{
  "errorMessage": null,
  "errorCode": null,
  "dates": {
    "tradeAmt": null,
    "riskLevel": "LEVEL30",
    "optSelected": {
      "77": [
        {
          "optionContent": "20-50万元",
          "productCode": null,
          "created": null,
          "optionOrder": null,
          "modified": null,
          "id": 361,
          "optionScore": 8,
          "isInvalid": 1
        }
      ],
      "78": [
        {
          "optionContent": "资产50-500万元,无债务或债务较轻",
          "productCode": null,
          "created": null,
          "optionOrder": null,
          "modified": null,
          "id": 365,
          "optionScore": 6,
          "isInvalid": 1
        }
      ]
    },
    "riskInfoResult": {
      "optLetter": "A",
      "mqOrder": "1",
      "residenceCountryCode": null,
      "taxReason": null,
      "residenceCountryName": null,
      "residenceCountryNameEn": null,
      "countryNameEn": null,
      "taxInfoCode": null,
      "taxInfoIsCompleted": true,
      "taxInfoIsRight": true,
      "countryCode": null,
      "taxId": null,
      "countryName": null,
      "taxReasonInt": null
    },
    "created": 1565654328000,
    "questions": [
      {
        "questionContent": "您的职业?",
        "productCode": null,
        "created": 1498630051000,
        "options": null,
        "questionSource": "BUSINESS",
        "modified": 1498630051000,
        "id": 75,
        "isInvalid": 1,
        "questionType": 1,
        "order": 1
      },
      {
        "questionContent": "您的主要收入来源是?",
        "productCode": null,
        "created": 1498630051000,
        "options": null,
        "questionSource": "BUSINESS",
        "modified": 1498630051000,
        "id": 76,
        "isInvalid": 1,
        "questionType": 1,
        "order": 2
      }
    ],
    "serialCode": "123",
    "isInvalid": 1,
    "expireTime": 1628783999000,
    "productCode": null,
    "modified": 1565654328000,
    "examScore": 56,
    "id": 4564568,
    "results": {
      "77": "361",
      "78": "365"
    },
    "account": "test"
  },
  "status": "SUCCESS"
}

Java代码:

String jsonStr = "";
Object rootJson = JsonPath.read(jsonStr, "$");

2.递归层次遍历JsonObjec,保存结点信息

Java代码

ZTreeNode zTreeNode = new ZTreeNode();
zTreeNode.setId("$");
zTreeNode.setpId("root");
zTreeNode.setName("root");
zTreeNode.setDepth(0);
zTreeNode.setPath("$");
traverseTree(rootJson, zTreeNode, zTreeNodes);
    public static void traverseTree(Object rootJson, ZTreeNode zTreeNode, List<ZTreeNode> zTreeNodes) {
        if (rootJson instanceof Map) {
            for (Map.Entry<String, Object> stringObjectEntry : ((Map<String, Object>) rootJson).entrySet()) {
                ZTreeNode zTreeNodeTemp = new ZTreeNode();
                zTreeNodeTemp.setDepth(zTreeNode.getDepth() + 1);
                zTreeNodeTemp.setPath(zTreeNode.getPath() + "." + stringObjectEntry.getKey());
                zTreeNodeTemp.setId(zTreeNodeTemp.getPath());
                zTreeNodeTemp.setName(stringObjectEntry.getKey());
                zTreeNodeTemp.setpId(zTreeNode.getPath());
                zTreeNodes.add(zTreeNodeTemp);
                traverseTree(stringObjectEntry.getValue(), zTreeNodeTemp, zTreeNodes);
            }
        } else if (rootJson instanceof List) {
            List json = (List) rootJson;
            for (int i = 0; i < json.size(); i++) {
                Object obj = json.get(i);
                ZTreeNode zTreeNodeTemp = new ZTreeNode();
                zTreeNodeTemp.setDepth(zTreeNode.getDepth() + 1);
                zTreeNodeTemp.setPath(zTreeNode.getPath() + "[" + i + "]");
                zTreeNodeTemp.setId(zTreeNodeTemp.getPath());
                zTreeNodeTemp.setName(zTreeNode.getName() + "[" + i + "]");
                zTreeNodeTemp.setpId(zTreeNode.getPath());
                zTreeNodes.add(zTreeNodeTemp);
                traverseTree(obj, zTreeNodeTemp, zTreeNodes);
            }
        } else {
            // do nothing
        }
    }

3.利用zTree展示结点为可视化树,点击对应树的结点即可获取对应结点的JsonPath

前端代码:

let zTreeObj;
// zTree 的参数配置
let setting = {
    data: {
        simpleData: {
            enable: true
        }
    },
    callback: {
        onClick: zTreeOnClick
    }
};
zTreeObj = $.fn.zTree.init($("#using_json"), setting, zNodes);
zTreeObj.expandAll(true);

4.扩展:将结点信息反向解析

递归解析zNodes+利用nestable插件可视化展示,效果如下:

前端代码:

        let detailResult = JSON.parse(zNodes);
        let nestableContent = $('<ol class="dd-list"></ol>');
        let dataId = 0;
    // 遍历解析Json
    function parseJson(jsonObj, nestableContent, dataId) {
        for (let key in jsonObj) {

            let element = jsonObj[key];
            if (element === null) {
                element = "null";
            }
            if (element.length > 0 && typeof (element) == "object" || typeof (element) == "object") {
                
                var li = $('<li class="dd-item" data-id="' + dataId + '"></li>');
                $(li).append('                   <div class="dd-handle">' +
                    '                       <span class="bg-muted p-xs b-r-sm">' + key + '</span>' +
                    '                   </div>').append('<ol class="dd-list"></ol>').appendTo(nestableContent);
                parseJson(element, $(li).children().eq(1), dataId);
            } else {
                dataId++;
                $('<li class="dd-item" data-id="' + dataId + '"></li>').append('                   <div class="dd-handle">' +
                    '                       <span class="bg-muted p-xs b-r-sm">' + key + '</span>' + element +
                    '                   </div>').appendTo(nestableContent);
            }

        }
    }

作者:京东科技 周波

来源:京东云开发者社区 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

钡铼BL124EC实现EtherCAT转Ethernet/IP的优势

钡铼技术的BL124EC是一款用于将EtherCAT从站转换为Ethernet/IP从站的网关设备。它是钡铼技术开发的高性能、可靠的工业自动化通信解决方案之一。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; BL124EC网关可以应用于多种工业自动化场景&#xff0c;以下…

1.6 IntelliJ IDEA开发工具

前言&#xff1a; ### 1.6 IntelliJ IDEA开发工具笔记 - **背景**&#xff1a; - 使用基础文本编辑器如记事本编写Java代码虽然可行&#xff0c;但存在效率低下且难以调试的问题。 - 集成开发环境 (IDE) 可以有效地提高Java程序的开发效率。 - **常见Java IDE**&#xf…

解决docker开启MySQL的binlog无法成功。docker内部报错:mysql: [ERROR] unknown variable

1. 报错信息 2. 操作流程 整个流程是这样的&#xff1a; 我愉快的输入docker ps&#xff0c;查看MySQL的docker 容器id 执行指令docker exec -it 8a \bin\bash进入容器内部执行vim /etc/my.cnf&#xff0c;打开配置文件按照网上说的&#xff0c;添加如下配置信息退出docker容…

韦东山老师 RTOS 入门课程(二)理解任务的创建,切换过程

RTOS 的核心实现&#xff1a;保存&#xff0c;恢复现场 接下来开始尝试实现 RTOS。当然我们开发的时候其实不用这样做&#xff0c;现在尝试实现只是为了更好地理解原理。 RTOS 的核心就是刚才在研究的问题&#xff1a;保存和恢复现场。再追其本质&#xff0c;其实就是所有寄存…

【Linux】 文件类型和访问权限

执行 ls -l &#xff08;或者&#xff1a;ll &#xff09; 指令查看文件的具体属性。 示例&#xff1a; drwxr-xr-x. 2 root root 33 10月 7 11:27 test2 看图说话&#xff1a; 下面是示例分解图 第一列的字符表示文件或目录的类型和权限。 第一个字符表示文件类型 例如&…

局域网内网管理软件有哪些功能?(局域网内网管理软件有哪些)

局域网&#xff08;LAN&#xff09;是指在一个小范围内&#xff08;如一个办公室、一个楼层或者一个大楼&#xff09;的计算机网络。随着互联网和科技的快速发展&#xff0c;局域网在企业、学校和个人生活中的应用越来越广泛。局域网内网管理软件是一种专门用于监控和控制局域网…

「天锐绿盾」——数据防泄露(智能透明加密保护)企业加密软件

天锐绿盾是一款专业的企业级加密软件&#xff0c;提供专业版、行业增强版和旗舰版&#xff0c;分别针对不同的用户需求。 PC访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 天锐绿盾数据防泄密模块&#xff0c;采取系统底…

【手绘 | 日漫风】从临摹开始控笔,线条,再到人体

博主&#xff1a;_LJaXi 专栏&#xff1a; Unity | 横版游戏开发 手绘入门 控笔 排线起稿方式九宫格起稿五官起稿专业起稿 握笔姿势三角握持姿势拇指指握姿势 勾线建议注意对于人体 控笔 排线 在绘画过程中&#xff0c;可以使用铅笔控制笔触的方向、压力和角度&#xff0c;以获…

tf卡损坏怎么修复恢复?

TF卡是一种极其微小的数据储存卡&#xff0c;常见于手机、行车记录仪、微型相机中。因为TF卡不具备读写保护功能&#xff0c;所以一旦发生损坏就会非常麻烦。今天小编就给大家介绍一下&#xff0c;TF卡突然损坏什么原因&#xff0c;TF卡损坏怎么办一招帮你修复。 一、TF卡突然损…

upload-labs靶场通关

文章目录 Pass-01 前端检测&#xff08;JS检测&#xff09;1.1 原理分析1.2 具体问题具体分析1.3 实验 Pass-02 后端检测&#xff08;MIME检测&#xff09;2.1 原理分析2.2 具体问题具体分析2.3 实验 Pass-03 后端检测&#xff08;黑名单绕过&#xff0c;特殊后缀名&#xff09…

DataX和dataX-web 集群部署及使用

&#x1f4d1; DataX和dataX-web 集群部署及使用 一 . 安装前准备 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 DataX 采用 框架 插件 的模式…

【Proteus仿真】【STM32单片机】智能饮水机

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用OLED液晶、按键、语音播放模块、DS18B20温度传感器、加热器和水泵等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示温度、温度阈值&a…

【Linux】 ls命令使用

ls&#xff08;英文全拼&#xff1a; list directory contents&#xff09;命令用于显示指定工作目录下之内容&#xff08;列出目前工作目录所含的文件及子目录)。 ls命令 -Linux手册页 著者 由Richard M.Stallman和David MacKenzie撰写。 语法 ls [-alrtAFR] [name...] ls命…

众佰诚:抖音开网店新手怎么做才能做起来

抖音作为国内最热门的短视频平台&#xff0c;其商业价值也日渐凸显。许多商家和个体经营者开始在抖音上开设网店&#xff0c;以此为新的销售渠道。那么&#xff0c;对于新手来说&#xff0c;如何才能在抖音上成功运营网店呢? 首先&#xff0c;明确经营定位。每个电商平台都有其…

云服务器可以做什么?分享阿里云服务器的十种玩法

阿里云服务器可以干什么&#xff1f;服务器的用途有很多&#xff0c;常见的有网站、小程序、视频服务器、手机APP等&#xff0c;例如微信基于腾讯云服务器&#xff0c;淘宝基于阿里云服务器&#xff0c;阿里云百科aliyunbaike.com来说下阿里云服务器十大用途&#xff1a; 目录…

理解C++四种强制类型转换

理解C强制类型转换 文章目录 理解C强制类型转换理解C强制转换运算符1 static_cast1.1. static_cast用于内置数据类型之间的转换1.2 用于指针之间的转换1.3 用于基类与派生类之间的转换 2. const_cast2.1示例12.2 示例2——this指针 3.reinterpret_cast3.1 示例1 4.dynamic_cast…

slamplay:用C++实现的SLAM工具集

0. 项目简介 slamplay 是一个功能强大的工具集合&#xff0c;可用于开始使用 C 来玩和试验 SLAM。这是一项正在进行的工作。它在单个 cmake 框架中安装并提供一些最重要的功能 后端框架&#xff08;g2o、gtsam、ceres、se-sync 等&#xff09;、 前端工具&#xff08;opencv、…

C++那些让我们偷懒的函数

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 前言 让我们康康c为我们提供的懒人函数吧&#xff0c;后续会…

tcpdump(一)基础理论知识

一 抓包分析技术初探 说明&#xff1a; 本篇章跟tcp/ip的知识没有关系,只是讲解tcpdump工具背景补充&#xff1a; 抓包是做报文分析的第一步敬畏心&#xff1a; 隔行如隔山,不要想当然 ① 背景 ② 抓包技术名词 1、捋顺这些技术的来龙去脉甚至八卦;2、这样我们在后续课程…

Stable Signature - 为开源生成式AI 创建的图像 添加水印的新方法

文章目录 关于 Stable Signature 关于 Stable Signature 一种为开源生成式AI创建的图像添加水印的新方法 Stable Signature: A new method for watermarking images created by open source generative AI https://ai.meta.com/blog/stable-signature-watermarking-generativ…