.net json key 多层 排序 json层级 |
您所在的位置:网站首页 › 遍历jsonobject › .net json key 多层 排序 json层级 |
将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(); }); } 其中数据结构部分如下图所示
如代码所示,输入为 { "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 |