[alibaba/fastjson]kotlin定义的data class中的属性无法用JSONField反序列化

2025-11-24 339 views
2

data class Address( @JSONField(name = "address_id") var id:Int = 0, @JSONField(name = "true_name") var receiver: String = "", @JSONField(name = "tel_phone") var phone: String = "",

@JSONField(name = "area_id")
var provinceId: Int = 0,
@JSONField(name = "city_id")
var cityId: Int=0,
@JSONField(name = "area_info")
var areaId: Int=0

)

如上的kotlin类利用fastjson无法正常转换,转换出来的属性值均为空,Gson的@SerializedName可以正常转换

回答

6

debug了一下,data class上的annotation,从java里读取不到。 真不清楚Gson怎么拿到的。

5

找到问题了, fastjson里的JsonField定义是ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER 比Gson的SerializedName多了一个 ElementType.PARAMETER

kotlin的data class是用构造函数的参数方式定义的field和setter、getter,kotlin转换java bytecode的以后,看到fastjson里的注解是作用到参数上,就没管。而Gson的注解发现只能放到field和method,就自动放过去了。

反射一下data class,发现fastjson的注解没有了,gson的注解出现在field上: @com.google.gson.annotations.SerializedName(alternate=[], value=bb)

由于fastjson的注解用到了一些地方的方法参数上,所以这个问题无法解决,fastjson暂时不支持kotlin的data class。

复现问题的办法,在idea里安装kotlin的插件,然后new kotlin project即可。

测试文件见附件。 @wenshao @UltramanTIGA