Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化Kotlin数据类时排除非null属性_Kotlin - Fatal编程技术网

序列化Kotlin数据类时排除非null属性

序列化Kotlin数据类时排除非null属性,kotlin,Kotlin,我经常会在Kotlin中创建一个内部用于数据模型的数据类。例如: data class MyDataModel( var id: String? = null, var ownerId: String, var name: String, var isPrivate: Boolean = false, ) 我经常需要将这些类序列化为JSON。问题是某些类属性不可为null,并且在某些情况下,我需要在序列化中排除这些字段。我还没有找到一个干净简单的方法来做到这一点

我经常会在Kotlin中创建一个内部用于数据模型的数据类。例如:

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)
    
  • 使用MyDataModelSerializable的序列化程序序列化MyDataModel类的实例:
  • 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值时才会包含它。我同意,您想要什么并不十分清楚,但可能值得阅读指南介绍,看看它是否适合您的尝试: