像 hasmap 一样将 json 对象解析为 kotlin 数据类列表

Parse json object to kotlin data class list like an hasmap

提问人:Eduardo Rafael Moraes 提问时间:3/9/2023 更新时间:3/10/2023 访问量:598

问:

我有一个很难将一个jsonObject解析为数据类对象,我需要这个对象的一个列表:

data class DataClassExample(val mandatory: Boolean,
val name: String,
val regex: String?,
val regex_check: Boolean)

我有这个json对象,其中我需要在数据类对象的一个列表中转换每个列表对象:

{
"defaultParameters": [
{
  "name": "business",
  "mandatory": true,
  "type": "String",
  "regex": "",
  "regex_check": true
},
{
  "name": "environment",
  "mandatory": true,
  "type": "String",
  "regex": "",
  "regex_check": true
}
],
"userParameters": [
{
  "name": "person_id",
  "mandatory": true,
  "type": "String",
  "regex": "",
  "regex_check": true
} ]

我将按 objectName 进行过滤,例如“defaultParameters”,并转换数据类中的列表,我的预期结果是:

listOf(DataClassExample(name = "", mandatory = true, type = "String", regex = "", ...), DataClassExample(...))

我尝试使用以下代码获取此值:

val response = allowList.filterKeys {
        it == "defaultParameters"
    } as MutableMap<String, String>

但我现在不知道如何在数据类列表中转换此代码。 Tks的

Android JSON Kotlin 解析 哈希图

评论


答:

-1赞 gioravered 3/9/2023 #1

我可以推荐一个名为 Klaxon 的第三方库

导入它,并将其添加到您的 Gradle 文件中:

dependencies {
    implementation 'com.beust:klaxon:5.5'
    ...
}

如果您的列表是:

val data = """[
            {
              "name": "business",
              "mandatory": true,
              "type": "String",
              "regex": "",
              "regex_check": true
            },
            {
              "name": "environment",
              "mandatory": true,
              "type": "String",
              "regex": "",
              "regex_check": true
            }
         ]"""

解析行为:

Klaxon().parseArray<DataClassExample>(data)
0赞 chrsblck 3/10/2023 #2

您可能希望引入序列化库,例如 Kotlin 序列化

目前尚不清楚您是否只尝试序列化/反序列化 json 的子集,如果是这样,您需要先解析它。

下面是一个反序列化整个 .data

我们将使用 Serializable 注解。

让我们创建一个来保存默认参数和用户参数:data class

@Serializable
data class AllParameters(
    val defaultParameters: List<Parameters>,
    val userParameters: List<Parameters>
)

@Serializable
data class Parameters(
    val mandatory: Boolean,
    val name: String,
    val type: String,
    val regex: String?,
    @SerialName("regex_check")
    val regexCheck: Boolean
)

并反序列化为对象:

val obj = Json.decodeFromString<AllParameters>(data)