农妇山泉一亩田 发表于 2023-10-16 09:56:08

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

https://rememberber.github.io//post-images/1591794506788.png
前端代码:
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插件可视化展示,效果如下:
https://rememberber.github.io//post-images/1591837961148.png
前端代码:
      let detailResult = JSON.parse(zNodes);
      let nestableContent = $('<ol ></ol>');
      let dataId = 0;
    // 遍历解析Json
    function parseJson(jsonObj, nestableContent, dataId) {
      for (let key in jsonObj) {

            let element = jsonObj;
            if (element === null) {
                element = "null";
            }
            if (element.length > 0 && typeof (element) == "object" || typeof (element) == "object") {
               
                var li = $('<lidata-id="' + dataId + '"></li>');
                $(li).append('                   ' +
                  '                     ' + key + '' +
                  '                   ').append('<ol ></ol>').appendTo(nestableContent);
                parseJson(element, $(li).children().eq(1), dataId);
            } else {
                dataId++;
                $('<lidata-id="' + dataId + '"></li>').append('                   ' +
                  '                     ' + key + '' + element +
                  '                   ').appendTo(nestableContent);
            }

      }
    }作者:京东科技 周波
来源:京东云开发者社区 转载请注明来源

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 递归解析Json,实现生成可视化Tree+快速获取JsonPath