You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 14下Jackson序列化Address模型多出stability字段求助

解决Android 14下Jackson序列化Parcelize类出现额外"stability"字段的问题

问题原因

Android 14对@Parcelize生成的Parcelable实现做了改动,新增了与稳定性相关的内部字段(stability),而Jackson 2.13.3的默认序列化逻辑会反射到这些自动生成的字段并将其输出。

解决方案

1. 升级Jackson到2.14.0及以上版本

Jackson从2.14.0开始优化了对Kotlin @Parcelize类的处理,会自动忽略这类系统生成的内部字段。修改依赖:

// Gradle示例
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.14.0'

2. 配置ObjectMapper强制忽略未声明字段

如果暂时无法升级Jackson,可全局配置ObjectMapper,指定只序列化类中显式声明的字段:

val jsonWrapper = ObjectMapper()
    .registerModule(KotlinModule())
    .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
    .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
    .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)

或者在数据类上正确配置@JsonIgnoreProperties:

@Parcelize
@JsonIgnoreProperties(ignoreUnknown = true, value = ["stability"])
data class Address(
    @JsonProperty("line1")
    val line1: String,
    @JsonProperty("line2")
    val line2: String?,
    @JsonProperty("city")
    val city: String,
    @JsonProperty("state")
    val state: String,
    @JsonProperty("postalCode")
    val postalCode: String
) : Parcelable

3. 手动实现Parcelable代替@Parcelize

如果上述方法无效,可放弃@Parcelize,手动编写Parcelable逻辑,避免生成额外内部字段:

data class Address(
    @JsonProperty("line1")
    val line1: String,
    @JsonProperty("line2")
    val line2: String?,
    @JsonProperty("city")
    val city: String,
    @JsonProperty("state")
    val state: String,
    @JsonProperty("postalCode")
    val postalCode: String
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString()!!,
        parcel.readString(),
        parcel.readString()!!,
        parcel.readString()!!,
        parcel.readString()!!
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(line1)
        parcel.writeString(line2)
        parcel.writeString(city)
        parcel.writeString(state)
        parcel.writeString(postalCode)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Address> {
        override fun createFromParcel(parcel: Parcel): Address {
            return Address(parcel)
        }

        override fun newArray(size: Int): Array<Address?> {
            return arrayOfNulls(size)
        }
    }
}

内容的提问来源于stack exchange,提问作者lokesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:52:50