.net json key 多层 排序 json层级

您所在的位置:网站首页 遍历jsonobject .net json key 多层 排序 json层级

.net json key 多层 排序 json层级

2023-06-30 12:19| 来源: 网络整理| 查看: 265

将json转成树状结构,然后展开成list,有key就取key,没key就取value,通过递归实现

JSONNode 是节点类,其中的key就是json的key,value是如果没有子节点的json的value

建这俩类唯一的好处就是把jsonobject格式化成一个确定的类,方便递归,就不用每次获取value的时候多次遍历看下面有多少个子节点,关键不知道层数,不方便递归

children是子节点(可以为另一个json,或者json array)

public class JSONNode { private String key; private int level; private String value; private List children; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public List getChildren() { return children; } public void setChildren(List children) { this.children = children; } }

jsontree 通过递归遍历 将json的key和value(如果有的话),及其子节点的递归打印出来

注:

json转树,不符合标准的树定义,有两点需要转换一下,方便递归

1,root没有key,key就暂定为"root",

2,如果某节点为 jsonarray,key就暂定为"i'm arr"

 

public class JSONTree { public static JSONNode createJSONTree(Object value, String key, int level) { JSONNode node = new JSONNode(); node.setKey(key); node.setLevel(level); level++; if (value instanceof JSONObject) { JSONObject jsonObject = (JSONObject) value; Set keySet = jsonObject.keySet(); List childrenList = new LinkedList(); for (String keyInner : keySet) { JSONNode childNode = createJSONTree(jsonObject.get(keyInner), keyInner, level); childrenList.add(childNode); } node.setChildren(childrenList); } else if (value instanceof JSONArray) { JSONArray jsonArray = (JSONArray) value; List childrenList = new LinkedList(); for (int index = 0; index < jsonArray.size(); index++) { JSONNode childNode = createJSONTree(jsonArray.get(index), "i'm arr", level); childrenList.add(childNode); } node.setChildren(childrenList); } else { node.setValue(String.valueOf(value)); node.setChildren(null); } return node; } public static LinkedList binaryTreePaths(JSONNode root) { LinkedList paths = new LinkedList(); getPath(root, new LinkedList(), paths); return paths; } public static void getPath(JSONNode root, LinkedList path, LinkedList paths) { if (root != null) { path.add(root.getKey()); if (root.getChildren() == null) { LinkedList dist = new LinkedList(); dist.addAll(path); dist.add(root.getValue()); paths.add(dist); } else { List list = root.getChildren(); for (JSONNode node : list) { LinkedList dist = new LinkedList(); dist.addAll(path); getPath(node, dist, paths); } } } } public static void main(String[] args) { JSONObject json = new JSONObject(); JSONObject json1 = new JSONObject(); json1.put("status", 1); json1.put("error", "001"); json1.put("msg", "err1"); json.put("1", json1); JSONObject json2 = new JSONObject(); json2.put("status", 1); json2.put("error", "002"); json2.put("msg", "err2"); json.put("2", json2); JSONArray json3 = new JSONArray(); json3.add(json1); json3.add(json2); json.put("3", json3); JSONNode root = JSONTree.createJSONTree(json, "root", 0); LinkedList paths = binaryTreePaths(root); paths.forEach(list -> { list.stream().map(s -> s + " ").forEach(System.out::print); System.out.println(); }); }

其中数据结构部分如下图所示

.net json key 多层 排序 json层级_List

 

 

如代码所示,输入为

{ "1": { "msg": "err1", "error": "001", "status": 1 }, "2": { "msg": "err2", "error": "002", "status": 1 }, "3": [{ "msg": "err1", "error": "001", "status": 1 }, { "msg": "err2", "error": "002", "status": 1 }] }

输出为:

root 1 msg err1 root 1 error 001 root 1 status 1 root 2 msg err2 root 2 error 002 root 2 status 1 root 3 i'm arr msg err1 root 3 i'm arr error 001 root 3 i'm arr status 1 root 3 i'm arr msg err2 root 3 i'm arr error 002 root 3 i'm arr status 1

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3