gpt4 book ai didi

Groovy - 如何将 json 转换为精确类型列表

转载 作者:行者123 更新时间:2023-12-04 16:44:01 25 4
gpt4 key购买 nike

我来自 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 列表,但我似乎找不到它。

有任何想法吗?

最佳答案

Groovy 的 JsonSlurper 中没有对 POJO 特性的反序列化类(class)。但是,您可以转换 LazyMap 的列表Employee 列表中的条目对象。我不知道你的 Employee class 看起来很像,但让我们假设它只有这两个字段,并且有一个接受两个参数的构造函数 - empIDlocation .

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 代码应该对正确的静态类型感到满意。

关于Groovy - 如何将 json 转换为精确类型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53508269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com