如何使用GSON将内部类序列化为单个值

q3aa0525  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(171)

假设以下两类
第一个
这个的JSON序列化是{"name":"Bob","address":{"city":"London","postcode":"LO12 345"}}
在API输出中,我希望将地址序列化为单个字符串,而不是对象。例如{"name":"Bob","address":"London, LO12 345"}
如果我为Person编写一个自定义序列化程序,我就可以实现这一点,甚至可以设法解决只更改这一个属性而不是所有属性的问题。但是,我仍然有一个问题,那就是我现在需要更改每个使用Address的类的方式。
我想知道,是否有一种方法可以为Address编写一个序列化器,它只返回一个值而不是一个对象,就像原语一样。然后我希望每个使用Address的类都能表现得好像Address是一个String一样,并将其序列化。
这种事可能吗?

8cdiaqws

8cdiaqws1#

您可以为Address编写一个序列化程序,如下所示:

class AddressSerialiser: JsonSerializer<Address> {
    override fun serialize(p0: Address, p1: Type?, p2: JsonSerializationContext?) =
        JsonPrimitive("${p0.city}, ${p0.postcode}")

}

此序列化程序输出一个JsonPrimitive,它是一个包含城市和邮政编码的字符串。
然后,您可以在创建Gson时注册此属性:

val gson = GsonBuilder()
    .registerTypeAdapter(Address::class.java, AddressSerialiser())
    .create()
println(gson.toJson(Person("John", Address("Cambridge", "CB5 8HX"))))

输出量:

{"name":"John","address":"Cambridge, CB5 8HX"}
r9f1avp5

r9f1avp52#

不确定这是否是您要寻找的,但如果您只是将其作为数据类呢?

data class Address internal constructor(var city: String, var postcode: String)

那么它的toString()是一个非常具有描述性的字符串,类似的对象也算作相等,比如

val a = Address("London", "LO12 345")
val b = Address("London", "LO12 345")

println(a) //prints: Address(city=London, postcode=LO12 345)
println(a == b) //prints: true

相关问题