JSON序列化/反序列化Kotlin Android Jetpack撰写表



我正在Jetpack Compose中创建一个表部分,用于从JSON中反序列化数据。

此时,我只是试图显示数据(表格格式化和清理将在稍后进行,因此您可以忽略这一部分)。事情一直都很顺利,直到我到达表格行值是数组的数组的部分。我得到这个错误: 错误:

期望类kotlinx.serialization.json.JsonObject作为…tablelow,但有类kotlinx. serialize .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"
]
]
},

这是我现在的代码。我只是想张贴两行数据:1与列标题名称,和1与所有的行数据(不需要看起来很好,在这一点上-我只是试图得到映射完成)

@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

注意:标题和表列标题工作得很好。抛出错误的是表数据。

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

@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))
}
}

最新更新