Лучший / менее подробный способ сопоставить сложный JSON ответ модели с использованием Джексона - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь сопоставить сложный 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...