Я пытаюсь сопоставить сложный JSON ответ с классом модели домена, используя Jackson 2. Модель домена - это упрощенная версия списка объектов, возвращаемых в ответе HTTP. Другая сложность заключается в том, что имена полей модели домена отличаются от возвращаемых в ответе JSON, что еще более усложняет ответ JSON, который состоит из списка объектов модели домена, которые я пытаюсь отобразить, а также другой информации. связанные с ответом. Кроме получения списка доменных объектов из ответа, я также хочу получить некоторые данные HTTP-ответа, которые не являются частью возвращаемого массива объектов данных, мне удалось сделать это с помощью функции readTree, а затем выполнить индексацию по ключам JSON дерево. это довольно неприятно, так как я должен проверить нулевые значения, так как не все поля возвращаются. Есть ли лучший способ добиться того, что я сделал в приведенном ниже коде? Я планирую скопировать это в пользовательский класс mapper, который я затем зарегистрирую в Object mapper, но он кажется очень многословным / как будто должен быть лучший способ сделать это, кроме создания DTO, который моделирует ответ?
мой код:
var export = CxExport()
var response = mapper.readTree(body)
var count = response["response"]["count"].asInt()
export.exportCount = count
export.accountId= 123456
export.exportType = ExportType.mention
export.exportStart = Timestamp.from(Instant.now())
export.exportEnd = Timestamp.from(Instant.now())
cxExportRepo.saveAndFlush(export)
var mentions: MutableList<Mention> = ArrayList()
var data = response["response"]["data"]
data.forEach {
println(it["permalink"]?.asText())
var locContinent: String? = null
var locCountry: String? = null
var locCity: String? = null
var locRegion: String? = null
var locLongitude: String? = null
var locLatitude: String? = null
var priorityId: Int? = null
var priorityName: String? = null
var priorityColor: String? = null
it["priority"]?.let {
priorityId = it["id"]?.asInt()
priorityColor = it["color"]?.asText()
priorityName = it["name"]?.asText()
}
it["location"]?.let {
locContinent = it["continent"]?.asText()
locCountry = it["country"]?.asText()
locCity = it["city"]?.asText()
locRegion = it["region"]?.asText()
locLongitude = it["longitude"]?.asText()
locLatitude = it["latitude"]?.asText()
}
var tags: String? = null
it["author"]["tags"]?.forEach {
it?.asText()?.let {
tags += it
}
}
mentions.add(Mention(
cxExport = export,
authorId = it["author"]["id"]?.asText(),
authorUrl = it["author"]["url"]?.asText(),
authorImg = it["author"]["img"]?.asText(),
authorTags = tags,
messageTitle =it["message"]["title"]?.asText(),
messageContent =it["message"]["content"]?.asText(),
messageLanguage = it["message"]["language"]?.asText(),
messageSentiment =it["message"]["sentiment"]?.asText(),
sourceId = it["source"]["id"]?.asText(),
sourceCategory = it["source"]["category"]?.asText(),
sourceType = it["source"]["type"]?.asText(),
sourceDomain = it["source"]["domain"]?.asText(),
sourceUrl = it["source"]["url"]?.asText(),
sourceProfile = it["source"]["profile_id"]?.asText(),
sourceProfileName = it["source"]["profile_name"]?.asText(),
locContinent = locContinent,
locCountry = locCountry,
locCity = locCity,
locRegion = locRegion,
locLongitude = locLongitude,
locLatitude = locLatitude,
permalink = it["permalink"]?.asText(),
priorityId = priorityId,
priorityName = priorityName,
priorityColor = priorityColor,
responseTime = it["timestamps"]["response_time"]?.asInt(),
resolveTime = it["timestamps"]["resolve_time"]?.asInt(),
handleTime = it["timestamps"]["handle_time"]?.asInt(),
dateAdded = it["date"]["added"]?.asInt(),
datePublished = it["date"]["published"]?.asInt()
)
)
}
// var response = jsonMap["response"]
// var mentions = response["data"]
mentionRepo.saveAll(mentions)