groovy - Groovy - 如何将 json 转换为精确类型的列表
问题描述
我来自 Java 背景,是 Groovy-Spock 测试的新手。我需要将 Json 中的列表转换为列表。我无法分享确切的代码(专有代码),但本质上这就是正在发生的事情。
emp_test_data.json
[{
"empID":"1234",
"location":"HQ"
},
{
"empID":"5678",
"location":"Warehouse"
}]
Groovy 代码
List<Employee> employeeList = slurper.parse(new File("src/test/resources/data/emp_test_data.json"))
println ("After slurped") //prints
println(pickupVOList.size() //prints 2
println(pickupVOList.get(0)) //prints [empID:5678, location:HQ]
empUtil.processEmployees(employeeList)
EmpUtil.java
public void processEmployees(List<Employee> employeeList) {
for (Employee employee: employeeList) { //THIS FAILS!
//Do some processing
}
return;
}
我得到的错误是:- java.lang.ClassCastException: groovy.json.internal.LazyMap 不能转换为 com.my.domain.Employee
我已经环顾四周了。在 Groovy 中,必须有将 json 转换为精确对象列表的正确方法,而不是 LazyMap 列表,但我似乎找不到它。
有任何想法吗?
解决方案
JsonSlurper
Groovy 的类中没有对 POJO 功能的反序列化。但是,您可以将LazyMap
条目列表转换为Employee
对象列表。我不知道你的Employee
类到底长什么样,但我们假设它只有这两个字段,并且有一个接受两个参数的构造函数 -empID
和location
.
File file = new File("src/test/resources/data/emp_test_data.json")
List<Employee> employeeList = slurper.parse(file).collect {
new Employee(it.empID, it.location)
}
如果您的Employee
类遵循 POJO 约定(默认的非参数构造函数,setter/getter),那么您可能会执行以下操作:
File file = new File("src/test/resources/data/emp_test_data.json")
List<Employee> employeeList = slurper.parse(file).collect {
def emp = new Employee()
emp.empID = it.empID
emp.location = it.location
return emp
}
甚至将转换部分提取到闭包中,以使代码更具可读性:
Closure asEmployee = { Map map ->
def emp = new Employee()
emp.empID = map.empID
emp.location = map.location
return emp
}
File file = new File("src/test/resources/data/emp_test_data.json")
List<Employee> employeeList = slurper.parse(file).collect(asEmployee)
现在您的 Java 代码应该对正确的静态类型感到满意。
推荐阅读
- php - 文件名包含变音符号(ä、ö、ü),因此文件名似乎不同
- python - 如何在python中声明变量关系
- python - 如何在 Python 中使用文件作为标准输入?
- apache-spark - 字符串连接运算符(||)在配置单元中抛出错误
- ruby-on-rails - 获取多关系数据 | 导轨
- ios - 对于 React Native 应用程序,如何使用 Detox with Jest 以特定顺序运行许多 e2e 文件?
- dart - 管道处理标准输出时保持输出的着色
- python - Pandas 最佳实践:删除列名?
- linux - 错误:找不到 Parrot/n/a 的分发模板
- sql - 如何将未来的日子带到过去的日期,然后使用 postgresql 恢复到过去的日子?