Я пытаюсь получить полезные данные из удаленного веб-сервиса, используя Джексона, где возвращаемый JSON содержит свойства, которые иногда определяются как массивы, а в другие - обычные строки.
Я пытался аннотировать поле с помощью JsonRawValue
, но все еще получаю сообщение об ошибке:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.lang.String out of START_ARRAY token
Следующие классы Kotlin используются для сериализации указанной полезной нагрузки JSON:
data class Device(
@get:JsonProperty("common.uuid")
val commonUuid: String? = null,
@field:JsonRawValue
@get:JsonProperty("user.ldap.groups.dn")
val userLdapGroupsDn: String? = null
)
data class DeviceSearchResults(
@JsonProperty("resultCount")
val resultCount: Int = 0,
@JsonProperty("totalCount")
val totalCount: Int = 0,
@JsonProperty("results")
val results: List<Device> = listOf()
)
.. и я собрал следующий модульный тест, чтобы показать ошибку:
окурки-получить devices.json
{
"results": [
{
"common.uuid": "848ba0e8-d313-4df5-9a9e-3d9ea28951fa",
"user.ldap.groups.dn": [
"cn=qss-role-megamall-internet,ou=foo,ou=groups,dc=bar"
]
}
]
}
@Test
fun testJsonSerialization() {
val objectMapper = ObjectMapper().apply {
setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
registerModule(KotlinModule())
}
val file = File("stubs/get-devices.json")
val value = objectMapper.readValue(file, DeviceSearchResults::class.java)
assertThat(value).isNotNull
println(value)
}
Есть ли способ привести значение массива JSON в свойство String в сериализованном объекте?