从 JSON 转换 Kotlin 数据类时处理非构造函数属性

问题描述 投票:0回答:1

我正在开发一个项目,我们需要使用 GSON 库将 Kotlin 数据类序列化为 JSON 或从 JSON 序列化/反序列化。我正在上的课程看起来像:

data class Request(val parent_identifier: String?=null, val identifier: String, val display_name: String,
                       val bssid: String, val company_address: LocationAddress,
                       val minimum_match_criteria: Boolean=false, val public_ip:String, val private_ip:String, val network_switches: List<ZoomNetworkSwitch>): HasUid {
        override val uid: String
            get() = display_name

        val country = company_address.country
        val address_line1 = company_address.address_line1
        val address_line2 = company_address.address_line2
        val city = company_address.city
        val state_code = company_address.state_code
        val zip = company_address.zip
}

注意用于获取嵌套地址数据的访问器属性。如果我使用 json 字符串调用 gson().fromJson() :

    {
            "display_name": "7th St Café",
            "private_ip": "111.0.0.0/16",
            "public_ip": "123.0.0.0/16",
            "identifier": "CAFE",
            "company_address": {
                "address_line1": "420 S 7th St",
                "address_line2": "7th St Café",
                "city": "Lewisburg",
                "country": "US",
                "state_code": " PA",
                "zip": " 17837"
            },
            "network_switches": [
                {
                    "mac_address": "00:bd:9e:ff:27:00"
                }
            ]
    }

查看生成的对象,构造函数属性将被初始化,但所有非构造函数属性将为 null。我需要做什么才能让 Gson 正确初始化这个类?

java json kotlin serialization gson
1个回答
0
投票
  1. 从GSON迁移(推荐)
  2. 将您的访问器更改为实际的访问器(
    get() = 
    像您的uid这样的声明),而不是复制company_address字段。

GSON 实际上并不支持 kotlin,而且永远不会支持,因为它“功能完整”并且正在维护中。因此,构造函数中的默认值之类的东西完全被忽略了。

更糟糕的是它是基于反射的,所以它的工作原理是强制创建每个字段中为 null 的新实例,然后填充它们(也使用反射)。目前,您的“访问器”是它可以理解的字段,因此它尝试从您的 json 字符串中携带它们,但它不包含任何这些值,因此它们保持为空。

© www.soinside.com 2019 - 2024. All rights reserved.