在Java中遍历复杂的对象图并获取属性的索引(类似于xpath)

时间:2016-03-09 00:02:08

标签: java javabeans jxpath

问题陈述:

想象一下如下的嵌套对象:

class Company{
...
List<Department> departments;
}

class Department{
...
List<Employee> employees;
}

class Employee{
String name;
...
}

公司有很多部门,每个部门都有很多员工。

Json正文由库解组,以创建Java对象公司,如上所示。

假设我有一个名字的员工:&#34; John&#34;,我正在寻找一个api,当我传入Employee对象的哈希值或属性名称时,返回该属性的Path。

search(Object attributeName,Object attributeValue),即search(&#34; name&#34;,&#34; John&#34;)应该返回 company.departments [0] .employees [5]

是否有一个好的开源库暴露类似的api或什么是绕过复杂对象图的最佳方法

JSR 303 Hibernate Validator,它自动将属性路径添加到ConstraintViolation中,并不公开它如何通过任何对象从复杂对象图获取属性路径的行为

如果有人遇到类似需求,请提供建议

2 个答案:

答案 0 :(得分:1)

我还没有看到过这样做的库,但您可以修改我的对象迭代器博客中的代码来执行此操作。

https://blog.stackhunter.com/2014/07/09/convert-java-objects-to-string-with-the-iterator-pattern/

迭代器导航对象图形以产生如下所示的输出,但您可以使它做任何事情 - 包括搜索键值对。

com.stackhunter.example.employee.Department@129719f4
  deptId = 5775
  employeeList = java.util.ArrayList@7037717a
employeeList[0] = com.stackhunter.example.employee.Employee@17a323c0
  firstName = Bill
  id = 111
  lastName = Gates
employeeList[1] = com.stackhunter.example.employee.Employee@57801e5f
  firstName = Howard
  id = 222
  lastName = Schultz
employeeList[2] = com.stackhunter.example.employee.Manager@1c4a1bda
  budget = 75000.0
  firstName = Jeff
  id = 333
  lastName = Bezos
  name = Sales
[I@39df3255
  object[0] = 111
  object[1] = 222
  object[2] = 333

快乐的编码!

答案 1 :(得分:0)

您可以使用SOJO (Simplified Old Java Objects)

根据theirs documentation,我认为PathRecordWalkerInterceptor是您要搜索的内容:

Car car = new Car("Ferrari");
ObjectGraphWalker walker = new ObjectGraphWalker();
PathRecordWalkerInterceptor interceptor = new PathRecordWalkerInterceptor();
walker.addInterceptor(interceptor);

walker.walk(car);
Map visitedPathes = interceptor.getAllRecordedPathes();