在 Kotlin 中解析带有动态字段的 json 对象

Posted

技术标签:

【中文标题】在 Kotlin 中解析带有动态字段的 json 对象【英文标题】:Parsing a json object with a dynamic field in Kotlin 【发布时间】:2018-05-07 06:05:17 【问题描述】:

我有一个 JSON 对象:


  "mobileNum": "05x-xxxxxxx", 
   "appId": "some_app", 
   "messageId": "printUsersFirstTime", 
   "shouldSendDate": "2017-10-03T16:20+03:00", // this is optional 
   "paramMap":  "userName": "some_name" , 
   "filters":  "UNIQUE": false, "RECENT": " \"unit\": \"MINUTE\", \"size\": 5 "

我使用 Spring Boot 和 Kotlin。 Spring boot 自动将提到的 JSON 映射到以下模型 bean:

data class SmsDto(
    var mobileNum: String? = null,
    val appId: String? = null,
    val messageId: String? = null,
    var paramMap: Map<String, String>? = null,
    var shouldSendDate: Timestamp? = null,
    var filters: Map<String, String>? = defaultFilters
)

如您所见,我遇到的问题是 filters 字段,它是一个 String,但可能包含另一个 JSON 对象。所以我使用了一种懒惰的解决方案,将内部的JSON双引号转义,然后自己解析。

是否有更标准的解决方案可以让我发送正确的内部 JSON 对象?

【问题讨论】:

【参考方案1】:

Spring Boot 似乎正在使用 Jackson 库来处理您的数据类和 json 格式。您可以使用另一个数据类作为filters 字段的类型。

data class SmsDto(
    var mobileNum: String? = null,
    val appId: String? = null,
    val messageId: String? = null,
    var paramMap: Map<String, String>? = null,
    var shouldSendDate: Timestamp? = null,
    var filters: SmsFiltersDto? = defaultFilters
)

data class SmsFiltersDto(
    var yourField: Boolean = false,
    ...
)

【讨论】:

以上是关于在 Kotlin 中解析带有动态字段的 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 ktor 框架的 graphql-kotlin 进行字段级解析器

如何使用带有 Kotlin 的 Gson 库访问 JSON 有效负载中的嵌套值

在android中使用GSON解析带有动态“key”和“value”的JSON

如何使用 GSON 解析动态 JSON 字段?

Android Kotlin + Klaxon - 解析 JSON 根数组

如何解析来自同一字段的多类型值的 json 响应?