序列化Kotlin数据类时排除非null属性
我经常会在Kotlin中创建一个内部用于数据模型的数据类。例如:序列化Kotlin数据类时排除非null属性,kotlin,Kotlin,我经常会在Kotlin中创建一个内部用于数据模型的数据类。例如: data class MyDataModel( var id: String? = null, var ownerId: String, var name: String, var isPrivate: Boolean = false, ) 我经常需要将这些类序列化为JSON。问题是某些类属性不可为null,并且在某些情况下,我需要在序列化中排除这些字段。我还没有找到一个干净简单的方法来做到这一点
data class MyDataModel(
var id: String? = null,
var ownerId: String,
var name: String,
var isPrivate: Boolean = false,
)
我经常需要将这些类序列化为JSON。问题是某些类属性不可为null,并且在某些情况下,我需要在序列化中排除这些字段。我还没有找到一个干净简单的方法来做到这一点。我当前使用的解决方案是不使用不可为null的属性,然后将我不希望序列化的属性设置为null
还有其他方法吗?解决方案使用:
@Serializable
@Serializable
开放类MyDataModelSerializable(
打开变量id:字符串?=null
)
数据类MyDataModel(
var ownerId:String,
变量名称:String,
变量isPrivate:Boolean=false,
重写变量id:字符串?=null
):MyDataModelSerializable(id)
val s=serializer()
println(Json.encodeToString(s,MyDataModel(ownerId=“1”,name=“2”,id=“3”,isPrivate=true))/{id:“3”}
println(Json.encodeToString(s,MyDataModel(ownerId=“1”,name=“2”,isPrivate=true))//{
println(Json{encodeDefaults=true}.encodeToString(s,MyDataModel(ownerId=“1”,name=“2”))/{id:null}
您使用什么进行序列化/反序列化?有多种方法依赖于that.Gson。Kotlin也有自己的序列化,但目前还不成熟。我不需要反序列化。只是序列化。在这种情况下,我建议使用这里介绍的方法之一,我知道这种解决方案。仅仅为了得到一个空序列化就太复杂了。是的,它可以与kotlin一起工作,是的,您只需要添加@JsonIgnore。我们使用jackson是因为它附带spring(我们几乎所有的服务都在kotlin中)。您需要使用jackson模块kotlin(它位于主maven repo中)。问题是,我不知道你的代码的其余部分是否在各个方面都比gson好,但至少在这个特殊情况下,这要容易得多。你可以在第7页看到(顺便说一句,我不是baeldung的附属机构),但是它序列化了整个类。没有什么是格森没有做过的。此外,您为第一项显示的输出仅显示id,但名称和ownerId不是null,也应该序列化。但这是您最初的要求-不序列化不可为null的字段。也许你把他们弄糊涂了?可空引用是指可以保持null的引用(如String?
),不可空引用是指不能保持null的引用(如String
)。如果需要相反的引用,则排除可空类型更容易,不需要任何辅助类,只需将原始数据类标记为@Serializable
,可为空的字段如@Transient
,序列化库也不会对默认值进行编码,因此,如果您不希望出现null
值的属性,请将其作为默认值(如您的示例中,var id:String?=null
),并且仅当它设置为非null值时才会包含它。我同意,您想要什么并不十分清楚,但可能值得阅读指南介绍,看看它是否适合您的尝试: