Groovy—如何将json转换为精确类型列表
我来自Java背景,是Groovy Spock测试的新手。我需要将Json中的列表转换为列表。我不能分享确切的代码(专有),但本质上是这样的 emp\u test\u data.json Groovy代码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
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}