基于现有数据创建Java JSON树结构

nwwlzxa7  于 2023-02-01  发布在  Java
关注(0)|答案(2)|浏览(142)

我需要你的帮助,从可用的数据中创建一个JSON树结构。这是我目前可用的数据,

json格式的相同数据如下,

{
"employees": [
  {
    "empId": 1,
    "empName": "Alex",
    "empGroupId": 3,
    "empLevel": 0
  },
  {
    "empId": 42,
    "empName": "Sam",
    "empGroupId": 3,
    "empLevel": 1
  },
  {
    "empId": 22,
    "empName": "Max",
    "empGroupId": 3,
    "empLevel": 2
  },
  {
    "empId": 54,
    "empName": "Ervin",
    "empGroupId": 3,
    "empLevel": 3
  },
  {
    "empId": 1,
    "empName": "Alex",
    "empGroupId": 5,
    "empLevel": 0
  },
  {
    "empId": 42,
    "empName": "Sam",
    "empGroupId": 5,
    "empLevel": 1
  },
  {
    "empId": 22,
    "empName": "Max",
    "empGroupId": 5,
    "empLevel": 2
  },
  {
    "empId": 68,
    "empName": "Jack",
    "empGroupId": 5,
    "empLevel": 3
  },
  {
    "empId": 1,
    "empName": "Alex",
    "empGroupId": 7,
    "empLevel": 0
  },
  {
    "empId": 38,
    "empName": "Mark",
    "empGroupId": 7,
    "empLevel": 7
  },
  {
    "empId": 12,
    "empName": "Danny",
    "empGroupId": 7,
    "empLevel": 2
  },
  {
    "empId": 1,
    "empName": "Alex",
    "empGroupId": 4,
    "empLevel": 0
  },
  {
    "empId": 38,
    "empName": "Mark",
    "empGroupId": 4,
    "empLevel": 1
  },
  {
    "empId": 55,
    "empName": "Kate",
    "empGroupId": 4,
    "empLevel": 2
  }
]
}

我想创建一个JSON树结构,它将以分层的方式Map所有的员工。这样所有的普通员工将只出现一次,并根据他们的级别。
因此,基本上,empName将有一个唯一的empId与其关联。多个员工可以是员工组的一部分[由empGroupId指示]。empLevel指示员工的级别,0表示顶层人员,然后1,依此类推...
例如,如果我们考虑上表中的前8行,则它包含2个empGroupId,即3和5。Alex、Sam和Max是两个组中公用的员工,级别分别为0、1、2。Ervin和Jack是最后一个级别,级别为3。由于他们的前3个成员相同,因此最终结构将具有:亚历克斯-〉山姆-〉马克斯-〉[欧文,杰克]
下面是我想要生成的,

[{
  "empName":"Alex",
  "empId" : 1,
  "empLevel" : 0,
  "children" :[{
    "empName":"Sam",
    "empId" : 42,
    "empLevel" : 1,
    "children" : [{
        "empName":"Max",
        "empId" : 22,
        "empLevel" : 2,
        "children": [{
            "empName":"Ervin",
            "empId" : 54,
            "empLevel" : 3            
            },{
            "empName":"Jack",
            "empId" : 68,
            "empLevel" : 3 
        }]
    }]
  },
  {
    "empName":"Mark",
    "empId" : 38,
    "empLevel" : 1,
    "children":[{
        "empName":"Danny",
        "empId" : 12,
        "empLevel" : 2
        },{
        "empName":"Kate",
        "empId" : 55,
        "empLevel" : 2      
    }]
  }]
}]

到目前为止,我已经创建了一个示例程序来读取JSON文件并Map雇员。但是不确定如何处理这个树结构的设计。这是我现在所拥有的。

@Data
public class Employee {
    private Integer empId;
    private String empName;
    private Integer empGroupId;
    private Integer empLevel;
}

@Data
public class EmpLevels {
    private List<Employee> employees;
}

@Data
public class EmpTree {
    private Integer empId;
    private String empName;
    private Integer empLevel;
    private List<Employee> children;
}

到目前为止,我的主方法包含以下内容,关于阅读JSON和Map员工,

EmpLevels empLevels = mapper.readValue(Paths.get("emp.json").toFile(), EmpLevels.class);
List<Employee> employees = empLevels.getEmployees();
System.out.println("Employees : "+employees);

如何继续构建生成JSON树结构的逻辑?我们有什么库可以帮助我们吗?或者有什么最新的Java发布特性可以帮助我们生成这个树结构吗?

rdrgkggo

rdrgkggo1#

当我看到您的JSON时,首先想到的是:

public class Employee {
    private Integer empId;
    private String empName;
    private Integer empGroupId;
    private List<Employee> children;
    }

如果不是这样,也许他们是一种方法来生成一个对象从您的JSON与Jackson/对象Map器,并找到一个想法他们?但我不知道如果Jackson可以做到这一点,没有一个给定的类,但也许它有助于您同时寻找一个解决方案。

laximzn5

laximzn52#

这是算法的问题,库或Java特性帮不了你。
首先,EmpTree.children应该是List<EmpTree>的类型。

@Data
public class EmpTree {
    private Integer empId;
    private String empName;
    private Integer empLevel;
    private List<EmpTree> children;
}

下面是一个递归函数,它构建了一个EmpTree

public EmpTree buildTree(List<Employee> employees, int empId, int empLevel) {
    List<Employee> parent = employees.stream()
        .filter(employee -> empId == employee.getEmpId())
        .collect(Collectors.toList());
    List<Integer> groups = parent.stream()
        .map(Employee::getEmpGroupId)
        .collect(Collectors.toList());
    List<EmpTree> childTree = employees.stream()
        .filter(child -> child.getEmpLevel() == empLevel + 1 && groups.contains(child.getEmpGroupId()))
        .map(Employee::getEmpId)
        .distinct()
        .map(childEmpId -> buildTree(employees, childEmpId, empLevel + 1))
        .collect(Collectors.toList());
    return new EmpTree(empId, parent.get(0).getEmpName(), parent.get(0).getEmpLevel(), childTree.isEmpty() ? null : childTree);
}

此语句用于调用函数。

EmpTree root = buildTree(employees, 1, 0);

相关问题