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

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

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

作者:京东科技 周波

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

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)

0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

C语言基础习题50例(六)26-30

习题26利用递归方法求5。实现思路:使用递归。代码如下:cinclude<stdio.hintmain(){intrec(intn);intresultrec(5);printf("5%d\n",result);return0;}intrec(intn){if(n1||n