从JSON获取交易列表时Kotlin数据类可选字段处理问题
Kotlin 可选JSON字段数据类定义解决方案
核心方案(常规场景推荐)
不需要定义多个重名的数据类,直接在现有交易数据类中新增type字段,声明为可空类型并设置默认值null即可:JSON解析时如果对应条目不存在type字段,会自动填充默认值null,不会触发解析错误。
修改后代码示例:
// Kotlin类名遵循大驼峰命名规范,原transactionsList调整为Transaction更符合规范 data class Transaction( val id: String, val date: String, val description: String, val amount: String, // 可选字段声明为可空类型,默认值设为null val type: String? = null ) // 对应修改AccountsList中transactions字段的泛型引用 data class AccountsList( val id: String, val IBAN: String, val amount: String, val currency: String, val transactions: List<Transaction> )
Gson、Moshi、Jackson等主流Kotlin JSON解析库均原生支持上述写法,无需额外配置。
进阶方案(需区分两类交易的场景)
如果业务逻辑需要对有type和无type的交易做完全不同的处理,可以用密封类实现多态解析:
// 交易密封基类 sealed class Transaction { abstract val id: String abstract val date: String abstract val description: String abstract val amount: String } // 无type字段的普通交易 data class CommonTransaction( override val id: String, override val date: String, override val description: String, override val amount: String ) : Transaction() // 带type字段的专项交易 data class TypedTransaction( override val id: String, override val date: String, override val description: String, override val amount: String, val type: String ) : Transaction()
该方案需要给对应JSON解析库配置多态解析适配器,适合两类交易业务逻辑差异较大的场景,普通场景使用可空字段方案即可。
内容的提问来源于stack exchange,提问作者Equlo
相关产品推荐
相关产品推荐

