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
相关产品推荐
相关产品推荐

