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

Groovy—如何将json转换为精确类型列表,groovy,spock,Groovy,Spock,我来自Java背景,是Groovy Spock测试的新手。我需要将Json中的列表转换为列表。我不能分享确切的代码(专有),但本质上是这样的 emp\u test\u data.json Groovy代码 List employeeList=slurper.parse(新文件(“src/test/resources/data/emp\u test\u data.json”)) println(“发出咕噜声后”)//打印 println(pickupVOList.size()//打印2 print

我来自Java背景,是Groovy Spock测试的新手。我需要将Json中的列表转换为列表。我不能分享确切的代码(专有),但本质上是这样的

emp\u test\u data.json

Groovy代码

List employeeList=slurper.parse(新文件(“src/test/resources/data/emp\u test\u data.json”))
println(“发出咕噜声后”)//打印
println(pickupVOList.size()//打印2
println(pickupVOList.get(0))//prints[empID:5678,位置:HQ]
empUtil.processEmployees(员工列表)
EmpUtil.java

public void processEmployees(列出employeeList){
对于(Employee:employeeList){//此操作失败!
//做一些处理
}
返回;
}
我得到的错误是:- java.lang.ClassCastException:groovy.json.internal.LazyMap不能强制转换为com.my.domain.Employee

在Groovy中,必须有正确的方法将json转换为精确对象列表,而不是LazyMap列表,但我似乎找不到它


有什么想法吗?

Groovy的
JsonSlurper
类中没有反序列化POJO特性。但是,您可以将
LazyMap
条目列表转换为
Employee
对象列表。我不知道您的
Employee
类到底是什么样的,但假设它只有这两个字段,并且有接受两个参数的单个构造函数-
empID
location

File File=new文件(“src/test/resources/data/emp\u test\u data.json”)
List employeeList=slurper.parse(file.collect){
新员工(it.empID、it.location)
}
如果您的
Employee
类遵循POJO约定(默认的非参数构造函数、setters/getter),那么您可以这样做:

File File=new文件(“src/test/resources/data/emp\u test\u data.json”)
List employeeList=slurper.parse(file.collect){
def emp=新员工()
emp.empID=it.empID
emp.location=it.location
返回电磁脉冲
}
或者甚至将转换部分提取到闭包中,以使代码更具可读性:

Closure-asEmployee={Map-Map->
def emp=新员工()
emp.empID=map.empID
emp.location=map.location
返回电磁脉冲
}
File File=new文件(“src/test/resources/data/emp\u test\u data.json”)
List employeeList=slurper.parse(file.collect)(asEmployee)
现在,您的Java代码应该满足于正确的静态类型。

那么:

List<Employee> employeeList = new JsonSlurper().parse(file).collect(it as Employee)

除非您的员工具有与JSON相同的字段(那么您可以使用map c'tor)或者您自己映射:您必须使用第三方映射或数据绑定工具,如Jackson或java universe提供的任何其他工具。+1.谢谢。这是可行的!但是,如果POJO中的字段数量很大-嵌入字段的企业域对象可能很多,这可能会变得很难处理,对吗?Groovy没有提供一种方法吗o将JSON字符串转换为对象列表?@OceanBlue正如cfrick在上面的评论中所提到的,JSON和Groovy/Java类之间的反序列化/序列化可以通过使用第三方库(如上面提到的Jackson databinder)来完成。Groovy在该领域提供的功能并不比Java多。唯一的区别是Groovy adds到Groovy(不是Java)类。在这种情况下,您可以将整个
LazyMap
传递给
Employee
构造函数,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)
public void processEmployees(List<Employee> employeeList) {
    for (Employee employee: employeeList) { //THIS FAILS!
        //Do some processing
    }
    return;
}
List<Employee> employeeList = new JsonSlurper().parse(file).collect(it as Employee)
def jsonSlurper = new JsonSlurper(type: JsonParserType.INDEX_OVERLAY)
def parsedList = jsonSlurper.parseText('[
    {"id":"123","createdAt":"2018-01-01T02:00:00+0000"}, 
    {"id":"124","createdAt":"2018-01-01T02:00:00+0000"}
    ]')
def objectList = parsedList.collect {it as Acc}