Groovy - Как конвертировать JSON в список точных типов - PullRequest
0 голосов
/ 28 ноября 2018

Я родом из 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;
}

Ошибка Iget is: - java.lang.ClassCastException: groovy.json.internal.LazyMap не может быть приведен к com.my.domain.Employee

Я немного осмотрелся.В Groovy должен быть правильный способ преобразования json в список точных объектов, а не в список LazyMap, но я не могу его найти.

Есть идеи?

1 Ответ

0 голосов
/ 28 ноября 2018

В классе Groovy JsonSlurper отсутствует десериализация для функции 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 (конструктор без параметров по умолчанию, сеттеры / получатели), вы можете сделать что-то вроде этого:

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 должен быть удовлетворен правильным статическим типом.

...