【问题标题】:Serializing Object with nested classes return empty String Kotlin使用嵌套类序列化对象返回空字符串 Kotlin
【发布时间】:2020-10-29 17:45:28
【问题描述】:

我是 kotlin 和 android 开发的新手。我目前正在尝试在我的本地服务器中获取对 django REST-API 的 POST 请求。我将 Retrofit 2 和 Gson 用于 http 请求和 JSON。

我有一个用于 POST 正文 (DataPost) 的类,如下所示:

class DataPost(_type: String, _attributes: Item) {
    @SerializedName("type")
    var type: String? = null


    @SerializedName("attributes")
    var attributes: Item? = null

}
class Item(_userId: Int, _dbId: Int, _title: String, _body: String){
    @SerializedName("userdId")
    var userdId: Int = 0
    @SerializedName("dbId")
    var dbId: Int = 0
    @SerializedName("title")
    var title: String? = null
    @SerializedName("body")
    var body: String? = null


    companion object {
        fun className(): String {return "Item"}
    }

}

当我初始化它并尝试序列化它并通过以下方式将其记录到 JSON 时:

var item: Item = Item(1,2,"Shiee","shie body")
var data: DataPost = DataPost("Item", item)
Log.i(TAG_LOGS, Gson.toJson(data))

我刚刚得到这个输出:

{}

并且控制台/日志中没有错误。所以我假设它没有因为嵌套对象而对它的属性进行序列化,但无论如何,我可能是错的。为什么我的 DataPost 对象返回一个空 JSON?

编辑:预期的 JSON:

{
            "type": "Item",
            "attributes": {
                "userdId": 1,
                "dbId": 2,
                "title": "Shiee",
                "body": "shiee body"
            }
}

【问题讨论】:

    标签: android json kotlin


    【解决方案1】:

    好的,我只需要删除 de 吗?将类型标记为可为空的运算符,因为我没有为可为空声明序列化。

    发件人:

    @SerializedName("type")
    var type: String? = null
    
    
    @SerializedName("attributes")
    var attributes: Item? = null
    

    收件人:

    @SerializedName("type")
    lateinit var type: String
    
    @SerializedName("attributes")
    lateinit var attributes: Item
    

    【讨论】:

    • 很好地解决了问题并更新了我们的解决方案!
    【解决方案2】:

    您传递给类的参数不会以任何方式使用。 例如,在DataPost 中,_type 作为构造函数中的参数,type 作为类中的属性。这两个无关。所以当你这样做时

    DataPost("Item", item)
    

    "Item"item 在构造函数中作为_type_attributes 传递,但随后它们没有被使用:特别是它们没有自动分配给typeattributes

    我不确定将属性的类型从可空类型更改为不可空类型对您有什么帮助,因为它不应该这样做。

    您需要做的是将您的vars 直接移动到构造函数或手动分配它们。 以您的 DataPost 类为例。你可以这样做:

    class DataPost(
        @SerializedName("type")
        var type: String?,
        @SerializedName("attributes")
        var attributes: Item?
    }
    

    class DataPost(_type: String, _attributes: Item) {
        @SerializedName("type")
        var type: String? = _type
    
    
        @SerializedName("attributes")
        var attributes: Item? = _attributes
    
    }
    

    附注:如果这些是不可变值,您可以将 var 更改为 val

    【讨论】:

    • 是的,你也是对的,我将其更改为具有将 _var 分配给对应字段的 init()。但真正的问题是 Gson 库默认情况下不会序列化 null 类型。感谢您的回答。
    • Gson 是一个 Java 库,在 Java 中所有类型总是可以为空的。可能你的意思是Gson在序列化时忽略了空值,即它不会输出{"type":null},而是{}。如果你愿意,你可以简单地构建一个 Gson 实例,它会这样做val gson = GsonBuilder().serializeNulls().create()。但是如果值不为 null,那么 Kotlin 类型是否可以为空都没有关系。
    猜你喜欢
    • 1970-01-01
    • 2019-09-11
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多