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

递归,解析,json,实现,生成,可视化,tree,快速,获取,jsonpath · 浏览次数 : 46

小编点评

**平台内部功能点的实现过程** **1. 解析 JSON 数据** - 利用 JSONPath 读取 JSON 文件的根节点。 - 递归遍历 JSON 对象,保存结点信息。 **2. 创建可视化树** - 利用 zTree 库构建可视化树。 - 点击树的结点,获取其 JSON Path。 **3. 生成 JSON Path 信息** - 从根节点获取 JSON Path 信息。 - 使用 JSONPath 解析 JSON 数据,获取 JSON Path 值。 **前端代码** ```javascript let zTreeObj; // zTree 的参数配置 let setting = { data: { simpleData: { enable: true } }, callback: { onClick: zTreeOnClick } }; zTreeObj = $.fn.zTree.init($('#using_json'), setting, zNodes); zTreeObj.expandAll(true); ``` **其他说明** - zTree 是一个 JavaScript 库,可用于创建可视化树。 - nestable 是一个 jQuery 插件,可用于在任何 jQuery 库中创建可视化列表。 - 该代码假设 JSON 数据的结构与示例中相同。

正文

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

递归解析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);
            }

        }
    }

作者:京东科技 周波

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

与递归解析Json,实现生成可视化Tree+快速获取JsonPath相似的内容:

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

内部平台的一个小功能点的实现过程,分享给大家: 递归解析Json,可以实现生成可视化Tree+快速获取JsonPath。 步骤: 1.利用JsonPath读取根,获取JsonObject 2.递归层次遍历JsonObjec,保存结点信息 3.利用zTree展示结点为可视化树,点击对应树的结点即可获取

简单易懂的JSON框架

分享一个由本人编写的JSON框架。 JSON反序列化使用递归方式来解析JSON字符串,不使用任何第三方JAR包,只使用JAVA的反射来创建对象(必须要有无参构造器),赋值,编写反射缓存来提升性能。支持复杂的泛型类型,数组类型等所有类型。(不支持高版本JDK1.8以上的日期类型,如LocalDate,

lodash已死?radash库方法介绍及源码解析 —— 对象方法篇

theme: nico 写在前面 主页有更多其他篇章的方法,欢迎访问查看。 本篇我们介绍radash中对象相关方法的使用和源码解析。 assign:递归合并两个对象 使用说明 功能说明:类似于 JavaScript 的 Object.assign 方法,用于将 override 对象的属性和值复制到

推荐一款.NET开源跨平台的开箱即用的DNS服务器软件

前言 今天要给大家推荐一款.NET开源跨平台的开箱即用的DNS服务器软件(用于提供 DNS 解析服务):Technitium DNS Server。 项目介绍 Technitium DNS Server是一个开源的权威和递归DNS服务器,可以用于自主托管DNS服务器以提升隐私和安全性。它可以直接使用

与堆和堆排序相关的问题

与堆和堆排序相关的问题 作者:Grey 原文地址: 博客园:与堆和堆排序相关的问题 CSDN:与堆和堆排序相关的问题 堆结构说明 堆结构就是用数组实现的完全二叉树结构,什么是完全二叉树?可以参考如下两篇博客: 使用二叉树的递归套路来解决的问题 快速求完全二叉树的节点个数 完全二叉树中如果每棵子树的最

leetcode - 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root = [1,2,2,null,3,null,3] 输出:false 解法思路 也是递归的思想 检查当前两个节点是否为null,是,则说明

Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】

〇、简介 1、什么是组合设计模式? 一句话解释: 针对树形结构的任意节点,都实现了同一接口,他们具有相同的操作,可以通过某一操作来遍历全部节点。 组合模式通过使用树形结构来组合对象,用来表示部分以及整体层次。组合模式属于结构型模式,多用于递归。 官方意图描述:将对象组合成树形结构,以表示“部分-整体

[转帖]19.awk报告生成器,文本解释器

在本博客中,AWK是一个系列文章,本人会尽量以通俗易懂的方式递进的总结awk命令的相关知识点。 awk系列博文直达链接:AWK命令总结之从放弃到入门 我们先来用专业的术语描述一下awk是什么,如果你看不懂,没关系,我们会再用”大白话”解释一遍。 awk是一个报告生成器,它拥有强大的文本格式化的能力,

递归在多级数据结构中的简单应用

哈喽,我是小码,半年多没更新了,这段时间换了新工作,工作也很忙。后续会尽量多写点,坚持确实是一件很难,很酷的事情。最近在公司负责开发商品有关的开发,商品包含类型、款式等属性,而类型可能有一级类型、二级类型甚至是三级类型,针对这种多级分类,这就就不好使用简单的查询了。之前也写了一篇文章,Java递归实

C++ 递归与面向对象编程基础

C++ 递归 递归是一种使函数调用自身的技术。这种技术提供了一种将复杂问题分解为简单问题的方法,从而更容易解决问题。 递归可能有点难以理解。理解其工作原理的最佳方法是通过实验来尝试。 递归示例 将两个数字相加很容易做到,但将一系列数字相加就更复杂了。在下面的示例中,通过将其分解为将两个数字相加的简单