JSON序列化/反序列化 Kotlin Android Jetpack Compose表格

3
我正在使用Jetpack Compose创建一个表格部分,该表格从JSON反序列化数据。
目前,我只是尝试显示数据(表格格式和清理将在以后进行,所以你可以忽略那部分)。一切都还好,直到我遇到表格行值为数组的部分时出现了错误。我得到了这个错误:
期望类kotlinx.serialization.json.JsonObject作为...TableRow的序列化主体,但得到了类kotlinx.serialization.json.JsonArray
这是被解析用于此表格的测试JSON的一部分:
{
 "title": "TRANSACTION HISTORY",
 "type": "Table",
 "names": [
      "Date",
      "Amount",
      "Lender",
      "Borrower"
   ],
    "values": [
        [
           "07\/01\/2014",
           "$315,000",
           "Steve's Lending Co.",
           "Glenn Danzig"
         ],
         [
           "10\/13\/2011",
           "$236,000",
           "Feet Company",
           "Marcus Toeswater"
         ]
      ]
   },
   {
     "title": "ASSESSMENT & TAX",
     "type": "Table",
     "names": [
          "Year",
          "Property Taxes",
          "Tax Assessment"
     ],
     "values": [
          [
            "2017",
            "$6,068",
            "$395,000"
          ],
          [
            "2016",
            "$5,864",
            "$372,000"
          ],
          [
            "2015",
            "$5,609",
            "$341,500"
          ]
      ]
   },

这是我目前的代码。我只是试图发布两行数据: 一行是列标题, 一行是所有行数据(此时不需要漂亮的外观 - 我只是想完成映射)。
@Serializable
@SerialName("Table")
@Parcelize
data class TableSection(
    override val title: String? = null,
    @SerialName("names")
    val columnHeader: ArrayList<String?> = arrayListOf(),
    @SerialName("values")
    val tableData: ArrayList<TableRow> = arrayListOf(),
) : Section() {
    @Composable
    override fun Content(modifier: Modifier) {
        return Column {
            Row {
                columnHeader.map {
                    Text(it ?: "")
                }
            }
            Row {
                tableData.map { row ->
                    row.tableRowValues.map { value ->
                        Text(value ?: "")
                    }
                }
            }
        }
    }
}

@Serializable
@Parcelize
data class TableRow(
    @Serializable
    val tableRowValues: ArrayList<String?> = arrayListOf(),
) : Parcelable

注意:标题和表列标题工作正常,出问题的是表格数据。

你可以使用以下插件将JSON转换为数据类。按ALT + K打开它,将整个JSON拖放到其中,并为您的数据类命名。然后,您就可以直接使用该对象了。 - Stefan de Kraker
1
很酷。我创建每个部分的数据类并没有遇到太多问题,但是我在反序列化数组的数组方面遇到了问题。我在网上找不到一个合理的解释。 - petestmart
除非我误解了你的观点。我还是有点新手。 - petestmart
1个回答

4

我最终创建了一个自定义序列化器来获取嵌套的值:

@Serializable(with = TableRowSerializer::class)
@Parcelize
data class TableRow(
    val tableRowValues: List<String?> = arrayListOf(),
) : Parcelable

object TableRowSerializer : KSerializer<TableRow> {
    private val serializer = ListSerializer(String.serializer())

    override val descriptor: SerialDescriptor = serializer.descriptor

    override fun serialize(encoder: Encoder, value: TableRow) {
        val rowValues = value.tableRowValues
            rowValues.let{rowValues as? List<String>}
                ?.let { encoder.encodeSerializableValue(serializer, it) }
    }

    override fun deserialize(decoder: Decoder): TableRow {
        return TableRow(decoder.decodeSerializableValue(serializer))
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接