Firestore是否会自动移除属性名称中的前缀"is"?
问题原因与解决方案
这不是Firestore的原生行为,而是你使用的kotlinx.serialization序列化库的默认规则——它会遵循JavaBean命名规范处理布尔类型字段:当字段以is开头时,序列化会自动移除is前缀,并将后续首字母转为小写,作为最终存储的键名,所以isRefund会被序列化为refund。
解决方法
最直接且可靠的方式是给目标字段添加@SerialName注解,强制指定序列化后的键名:
@Serializable data class Transaction internal constructor( val projectId: String = "", val amount: Double = 0.0, val currency: String = "USD", @SerialName("isRefund") // 显式指定序列化后的键名 val isRefund: Boolean = false, ) { @Serializable(with = InstantSerializer::class) val createdAt: Instant = Instant.now() companion object { fun new( projectId: String, amount: Double, currency: String, isRefund: Boolean ): Transaction { return Transaction( projectId = projectId, amount = amount, currency = currency, isRefund = isRefund ) } } }
这样无论序列化库的默认规则如何,isRefund字段都会以你指定的键名isRefund存储到Firestore中,完全符合预期。
另外,因为你的代码是作为库提供给消费者使用,显式指定@SerialName还能避免消费者因序列化配置不同导致的字段名不一致问题,保证兼容性。
内容的提问来源于stack exchange,提问作者Son Nguyen
相关产品推荐
相关产品推荐

