问题陈述:
想象一下如下的嵌套对象:
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中,并不公开它如何通过任何对象从复杂对象图获取属性路径的行为
如果有人遇到类似需求,请提供建议
答案 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();