gpt4 book ai didi

android - JSON 序列化/反序列化 Kotlin Android Jetpack Compose 表

转载 作者:行者123 更新时间:2023-12-05 03:25:02 36 4
gpt4 key购买 nike

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

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

错误:

Expected class kotlinx.serialization.json.JsonObject as the serialized body of ...TableRow, but had class 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"
]
]
},

这是我现在拥有的代码。我只是想发布两行数据: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))
}
}

关于android - JSON 序列化/反序列化 Kotlin Android Jetpack Compose 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72134357/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com