有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何获取json中每个对象的级别,其中对象可以有任意数量的相同对象类型的子对象

我有一个员工级别的结构,如下图enter image description here

这个结构是在json的帮助下填充和存储的,如下所示

 {
  "name": "Lao Lao",
  "title": "general manager",
  "children": [
    {
      "name": "Bo Miao",
      "title": "department manager",
      "children": [
        {
          "name": "Li Jing",
          "title": "senior engineer"
        },
        {
          "name": "Li Xin",
          "title": "senior engineer",
          "children": [
            {
              "name": "To To",
              "title": "engineer"
            },
            {
              "name": "Fei Fei",
              "title": "engineer"
            },
            {
              "name": "Xuan Xuan",
              "title": "engineer"
            }
          ]
        }
      ]
    },
    {
      "name": "Su Miao",
      "title": "department manager",
      "children": [
        {
          "name": "Pang Pang",
          "title": "senior engineer"
        },
        {
          "name": "Hei Hei",
          "title": "senior engineer",
          "children": [
            {
              "name": "Xiang Xiang",
              "title": "UE engineer"
            },
            {
              "name": "Dan Dan",
              "title": "engineer"
            },
            {
              "name": "Zai Zai",
              "title": "engineer"
            }
          ]
        }
      ]
    }
  ]
} 

我想解析这个Json,以获得所有级别和父名称如下的对象

{name =  Lao lao , parent = null , level = 1 }
{name =  Bao Miao , parent = Lao lao , level = 2 }
..................................................
{name =  Li Jing  , parent = Bao Miao , level = 3 }

我们如何在java的帮助下解析它?如果有这样的功能库,请告诉我


共 (3) 个答案

  1. # 1 楼答案

    是的,你能做到。首先,需要将这个json映射到POJO。 所以,创建一个这样的模型类

    class Employee{
    
    String name;
    String title;
    List<Employee> Children;
    
    }
    

    如果你能把这个json映射到POJO。然后你只需要运行一个循环就可以得到你想要的

  2. # 2 楼答案

    看起来我有很多时间,浪费时间为你做这件事,因为它听起来很有挑战性。基本上,我先把它变成一个jsonObject,然后我做一个bfs图形漫游来找到级别,家长告诉你这是一个图形问题,级别上又有一些错误,但我希望社区或你自己修复错误

    编辑:我已经为您修复了关卡错误,如果您有任何问题,请再次询问我

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) throws Exception{
            String JSON_STRING = "{\n" +
                    "  \"name\": \"Lao Lao\",\n" +
                    "  \"title\": \"general manager\",\n" +
                    "  \"children\": [\n" +
                    "    {\n" +
                    "      \"name\": \"Bao Miao\",\n" +
                    "      \"title\": \"department manager\",\n" +
                    "      \"children\": [\n" +
                    "        {\n" +
                    "          \"name\": \"Li Jing\",\n" +
                    "          \"title\": \"senior engineer\"\n" +
                    "        },\n" +
                    "        {\n" +
                    "          \"name\": \"Li Xin\",\n" +
                    "          \"title\": \"senior engineer\",\n" +
                    "          \"children\": [\n" +
                    "            {\n" +
                    "              \"name\": \"To To\",\n" +
                    "              \"title\": \"engineer\"\n" +
                    "            },\n" +
                    "            {\n" +
                    "              \"name\": \"Fei Fei\",\n" +
                    "              \"title\": \"engineer\"\n" +
                    "            },\n" +
                    "            {\n" +
                    "              \"name\": \"Xuan Xuan\",\n" +
                    "              \"title\": \"engineer\"\n" +
                    "            }\n" +
                    "          ]\n" +
                    "        }\n" +
                    "      ]\n" +
                    "    },\n" +
                    "    {\n" +
                    "      \"name\": \"Su Miao\",\n" +
                    "      \"title\": \"department manager\",\n" +
                    "      \"children\": [\n" +
                    "        {\n" +
                    "          \"name\": \"Pang Pang\",\n" +
                    "          \"title\": \"senior engineer\"\n" +
                    "        },\n" +
                    "        {\n" +
                    "          \"name\": \"Hei Hei\",\n" +
                    "          \"title\": \"senior engineer\",\n" +
                    "          \"children\": [\n" +
                    "            {\n" +
                    "              \"name\": \"Xiang Xiang\",\n" +
                    "              \"title\": \"UE engineer\"\n" +
                    "            },\n" +
                    "            {\n" +
                    "              \"name\": \"Dan Dan\",\n" +
                    "              \"title\": \"engineer\"\n" +
                    "            },\n" +
                    "            {\n" +
                    "              \"name\": \"Zai Zai\",\n" +
                    "              \"title\": \"engineer\"\n" +
                    "            }\n" +
                    "          ]\n" +
                    "        }\n" +
                    "      ]\n" +
                    "    }\n" +
                    "  ]\n" +
                    "}] \n";
    
            JSONObject obj = new JSONObject(JSON_STRING);
    
            Deque<JSONObject> deque = new ArrayDeque<>();
            Map<String, String> res = new HashMap<>();
            int level = 1;
            res.put("NULL", obj.getString("name")+ "-" + level);
            deque.add(obj);
            Map<String, Integer> levelmap = new HashMap<>();
            levelmap.put(obj.getString("name"), 1);
            while (!deque.isEmpty()){
                JSONObject u = deque.poll();
                try {
                    JSONArray children =  u.getJSONArray("children");
                    for (int i = 0; i < children.length(); i++) {
                        deque.add(children.getJSONObject(i));
                        levelmap.put(children.getJSONObject(i).getString("name"), levelmap.get(u.getString("name")) + 1);
                        res.put(children.getJSONObject(i).getString("name"), u.getString("name") + "-" + levelmap.get(children.getJSONObject(i).getString("name")));
                    }
                }catch (JSONException jex){
                    System.out.println("end of the tree");
                }
            }
    
            //turn it back into a json array format
            String str = new String("[]");
    
            JSONArray jsonArray = new JSONArray(str);
    
            System.out.println(res);
    
            for(String key: res.keySet()){
                String st = new String("{}");
                JSONObject jsonObject = new JSONObject(st);
                //key is parent
                String[] tok = res.get(key).split("-");
                String child = tok[0];
                String mylevel = tok[1];
                jsonObject.put("name", key);
                jsonObject.put("level", mylevel);
                jsonObject.put("parent", child);
                jsonArray.put(jsonObject);
            }
    
            System.out.println(jsonArray.toString(2));
    
        }
    }
    

    输出:

    [
      {
        "parent": "Hei Hei",
        "level": "4",
        "name": "Xiang Xiang"
      },
      {
        "parent": "Lao Lao",
        "level": "2",
        "name": "Bao Miao"
      },
      {
        "parent": "Lao Lao",
        "level": "1",
        "name": "NULL"
      },
      {
        "parent": "Su Miao",
        "level": "3",
        "name": "Hei Hei"
      },
      {
        "parent": "Hei Hei",
        "level": "4",
        "name": "Dan Dan"
      },
      {
        "parent": "Hei Hei",
        "level": "4",
        "name": "Zai Zai"
      },
      {
        "parent": "Li Xin",
        "level": "4",
        "name": "Xuan Xuan"
      },
      {
        "parent": "Su Miao",
        "level": "3",
        "name": "Pang Pang"
      },
      {
        "parent": "Li Xin",
        "level": "4",
        "name": "Fei Fei"
      },
      {
        "parent": "Li Xin",
        "level": "4",
        "name": "To To"
      },
      {
        "parent": "Bao Miao",
        "level": "3",
        "name": "Li Jing"
      },
      {
        "parent": "Lao Lao",
        "level": "2",
        "name": "Su Miao"
      },
      {
        "parent": "Bao Miao",
        "level": "3",
        "name": "Li Xin"
      }
    ]
    
  3. # 3 楼答案

    实现模型定义如下。还可以在模型类中放置level和parentName

    class Employee{
        String name;
        String title;
        Employee children[];
        int level;
        String parentName;
    
        @Override
        public String toString(){
            return "{name =  "+name+" , parent = "+parentName+ ", level = "+level+ " }";
        }
    }
    

    使用GSON API解析json数据

    Employee e= new Gson().fromJson(new JsonReader(new FileReader("file.json")), Employee.class);
    

    这是你的完整程序。在花了一个小时的时间之后,我终于能够为您编写所有代码。到目前为止工作还不错:)

    import java.io.FileReader;
    
    import com.google.gson.Gson;
    import com.google.gson.stream.JsonReader;
    
    public class ParseJson {
    
        public static void main(String a[]) {
            Gson g = new Gson();
            try {
                Employee e = g.fromJson(new JsonReader(new FileReader("file.json")), Employee.class);
    
                parseEmployees(e);
                printEmployee(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
    
        }
    
        private static void parseEmployees(Employee e) {
            setParentAndLevel(e, 1, null);
        }
    
        private static void setParentAndLevel(Employee e, int lvl, String parent) {
            e.level = lvl;
            e.parentName = parent;
            if (e.children != null && e.children.length > 0) {
                lvl++;
                for (Employee emp : e.children) {
                    setParentAndLevel(emp, lvl, e.name);
                }
            }
        }
    
        public static void printEmployee(Employee e){
            System.out.println(e);
            if (e.children != null && e.children.length > 0) {
                for (Employee emp : e.children) {
                    printEmployee(emp);
                }
            }else{
                return ;
                }
            }
        }
    
        class Employee {
            String name;
            String title;
            Employee children[];
            int level;
            String parentName;
    
            @Override
            public String toString() {
                return "{name =  " + name + " , parent = " + parentName + ", level = " + level + " }";
            }
        }
    

    输出:

    {name =  Lao Lao , parent = null, level = 1 }
    {name =  Bo Miao , parent = Lao Lao, level = 2 }
    {name =  Li Jing , parent = Bo Miao, level = 3 }
    {name =  Li Xin , parent = Bo Miao, level = 3 }
    {name =  To To , parent = Li Xin, level = 4 }
    {name =  Fei Fei , parent = Li Xin, level = 4 }
    {name =  Xuan Xuan , parent = Li Xin, level = 4 }
    {name =  Su Miao , parent = Lao Lao, level = 2 }
    {name =  Pang Pang , parent = Su Miao, level = 3 }
    {name =  Hei Hei , parent = Su Miao, level = 3 }
    {name =  Xiang Xiang , parent = Hei Hei, level = 4 }
    {name =  Dan Dan , parent = Hei Hei, level = 4 }
    {name =  Zai Zai , parent = Hei Hei, level = 4 }