Пример на Kotlin для конвертирования JSON массива в список объектов. Дан сервис:
@RestController
@RequestMapping("/company")
@Api(tags = ["Rest Company"])
class CompanyCtrl(val companyService: CompanyService) {
@GetMapping("/")
@ApiOperation("Get all companies")
fun getAll(): List {
logger.info("Get all companies")
val companies = companyService.getAllSortedByField("n")
logger.info(companies.toString())
return companies
}
}
возвращающий JSON со списком объектов. Получение списка от сервиса:
$ http :8980/vacancy/api/company/ HTTP/1.1 200 Content-Type: application/json [ {"n": -1, "name": "-"}, {"n": 1, "name": "COMPANY_1"}, {"n": 2, "name": "COMPANY_2"}, {"n": 3, "name": "3_COMPANY"} ]
JSON неправильный. Правильно будет как-то так:
{ "companies": [ {"n": -1, "name": "-"}, {"n": 1, "name": "COMPANY_1"}, {"n": 2, "name": "COMPANY_2"}, {"n": 3, "name": "3_COMPANY"} ] }
Тем не менее, нужно тестировать. Показаны примеры для Jackson и Gson. Интеграционный тест:
package ru.perm.v.vacancy.service import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue import com.google.gson.Gson import com.google.gson.reflect.TypeToken import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.ActiveProfiles import org.springframework.web.client.RestTemplate import ru.perm.v.vacancy.dto.CompanyDto /** * Test with projectRestTemplate */ @SpringBootTest @ActiveProfiles("dev") class RestTemplateForServicesTest { @Autowired val projectRestTemplate: ProjectRestTemplate? = null @Value("\${myconfig.remoteHost}") val remoteHost: String? = null private val logger = LoggerFactory.getLogger(this.javaClass.name) @Test fun getMyConfigRemoteHost() { assertEquals("http://127.0.0.1:8980/vacancy/api", remoteHost) } @Test fun getByN_WithProjectRestTemplate() { val company = projectRestTemplate?.getForObjectCompany(remoteHost + "/company/1") assertEquals(CompanyDto(1, "COMPANY_1"), company) } @Test fun getAllCheckBody_WithProjectRestTemplateAndGson() { val json = RestTemplate().getForEntity(remoteHost + "/company/", String::class.java).body val typeToken = object : TypeToken<kotlin.collections.List>() {}.type val companies = Gson().fromJson<List>(json, typeToken) assertEquals(4, companies.size) assertEquals(CompanyDto(-1L, "-"), companies[0]) assertEquals(CompanyDto(1, "COMPANY_1"), companies[1]) assertEquals(CompanyDto(2, "COMPANY_2"), companies.get(2)) assertEquals(CompanyDto(3, "3_COMPANY"), companies.get(3)) } @Test fun getAllCheckBody_WithProjectRestTemplateAsReceiveStringToJackson() { val jacksonMapper = jacksonObjectMapper() val json = RestTemplate().getForEntity(remoteHost + "/company/", String::class.java).body val companies: List = jacksonMapper.readValue(json) assertEquals(4, companies.size) assertEquals(CompanyDto(-1L, "-"), companies[0]) assertEquals(CompanyDto(1, "COMPANY_1"), companies[1]) assertEquals(CompanyDto(2, "COMPANY_2"), companies.get(2)) assertEquals(CompanyDto(3, "3_COMPANY"), companies.get(3)) } // received LinkedHashMap @Test fun getAllCheckBody_WithProjectRestTemplateAndJacksonAndBodyAsArray() { val response = RestTemplate().getForEntity(remoteHost + "/company/", Array::class.java).body assertEquals(4, response.size) assertEquals(java.util.LinkedHashMap::class.java, response[0]!!.javaClass) } @Test fun getAllCheckBody_WithProjectRestTemplateAndJacksonAndBodyConvert() { val jsonString = RestTemplate().getForEntity(remoteHost + "/company/", String::class.java).body val mapper = ObjectMapper() // convert to LIST with TYPE CompanyDto val type = mapper.getTypeFactory().constructParametricType( List::class.java, CompanyDto::class.java); val companies = mapper.readValue<List>(jsonString, type) assertEquals(4, companies.size) assertEquals(CompanyDto(-1L, "-"), companies[0]) assertEquals(CompanyDto(1, "COMPANY_1"), companies[1]) assertEquals(CompanyDto(2, "COMPANY_2"), companies.get(2)) assertEquals(CompanyDto(3, "3_COMPANY"), companies.get(3)) } // Оставлен для примера где может появиться LinkedHashMap @Test fun getAllCheckBody_WithProjectRestTemplate() { val response = RestTemplate().getForEntity(remoteHost + "/company/", Array::class.java).body assertEquals(4, response.size) assertEquals(java.util.LinkedHashMap::class.java, response[0]!!.javaClass) } }
Еще пример:
package ru.perm.v.vacancy.service
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.ActiveProfiles
import org.springframework.web.client.RestTemplate
import ru.perm.v.vacancy.dto.CompanyDto
@SpringBootTest
@ActiveProfiles("test")
class ProjectRestTemplateIntegrationTest {
@Value("\${myconfig.remoteHost}")
val remoteHost: String? = null
@Autowired
lateinit var projectRestTemplate: ProjectRestTemplate
@Test
fun checkRemoteHostValue() {
assertEquals("http://127.0.0.1:8980/vacancy/api", remoteHost)
}
@Test
fun checkWorkRestTemplate() {
val COMPANY_N = 1L
val companyDTO = projectRestTemplate?.getForObjectCompany("http://127.0.0.1:8980/vacancy/api/company/${COMPANY_N}")
assert(companyDTO != null)
assertEquals(CompanyDto(COMPANY_N, "COMPANY_1"), companyDTO)
}
@Test
fun forEntity() {
val url = "http://127.0.0.1:8980/vacancy/api/company/1"
val company = RestTemplate().getForEntity(url, CompanyDto::class.java).body as CompanyDto
assertEquals(1, company.n)
}
@Test
fun forResponseEntity() {
val url = "http://127.0.0.1:8980/vacancy/api/company/1"
val responseEntity = RestTemplate().getForEntity(url, CompanyDto::class.java)
assertEquals(CompanyDto(1,"COMPANY_1"), responseEntity.body)
}
@Test
fun forList() {
val url = "http://127.0.0.1:8980/vacancy/api/company/"
val companies = RestTemplate().getForEntity(url, List::class.java).body as List
assertEquals(4, companies.size)
}
Ссылки:
Примеры для Kotlin конвертирования из JSON списка объектов