kotlin中使用TypeReference解析数据的时候无法正确的解析.在相同的代码中 java代码是可以解析的.
版本 : 1.2.22
java代码
@Test
public void test() {
File file = new File("d:\\Develop\\Android\\Projects\\cfzx素材\\city\\a.json ");
String s = FilesKt.readText(file, Charset.forName("UTF-8"));
List<Address> addresses = JSON.parseObject(s, new TypeReference<List<Address>>() {
});
System.out.println(addresses);
}
结果正确解析了

kotlin代码
@Test
fun test3() {
val file = File("d:\\Develop\\Android\\Projects\\cfzx素材\\city\\a.json ")
val s = file.readText()
val addresses = JSON.parseObject(s, object : TypeReference<List<Address>>() {
})
println(addresses)
}
结果解析失败

实体类
package com.cfzx.api.util;
class Address {
constructor()
/**
* name : 北京
* code : 100000
* cityArr : [{"name":"北京市","code":"110000","areaArr":[{"name":"朝阳区","code":"110105"},{"name":"海淀区","code":"110108"},{"name":"东城区","code":"110101"},{"name":"西城区","code":"110102"},{"name":"石景山区","code":"110107"},{"name":"丰台区","code":"110106"},{"name":"通州区","code":"110112"},{"name":"昌平区","code":"110114"},{"name":"大兴区","code":"110115"},{"name":"怀柔区","code":"110116"},{"name":"顺义区","code":"110113"},{"name":"平谷区","code":"110117"},{"name":"房山区","code":"110111"},{"name":"门头沟区","code":"110109"},{"name":"密云县","code":"110228"},{"name":"延庆县","code":"110229"}]}]
*/
var name: String? = null
var code: String? = null
/**
* name : 北京市
* code : 110000
* areaArr : [{"name":"朝阳区","code":"110105"},{"name":"海淀区","code":"110108"},{"name":"东城区","code":"110101"},{"name":"西城区","code":"110102"},{"name":"石景山区","code":"110107"},{"name":"丰台区","code":"110106"},{"name":"通州区","code":"110112"},{"name":"昌平区","code":"110114"},{"name":"大兴区","code":"110115"},{"name":"怀柔区","code":"110116"},{"name":"顺义区","code":"110113"},{"name":"平谷区","code":"110117"},{"name":"房山区","code":"110111"},{"name":"门头沟区","code":"110109"},{"name":"密云县","code":"110228"},{"name":"延庆县","code":"110229"}]
*/
var cityArr: List<CityArrBean> = mutableListOf()
class CityArrBean {
var name: String? = null
var code: String? = null
/**
* name : 朝阳区
* code : 110105
*/
var areaArr: List<AreaArrBean> = mutableListOf()
class AreaArrBean {
var name: String? = null
var code: String? = null
}
}
}
数据
[
{
"name": "北京",
"code": "100000",
"cityArr": [
{
"name": "北京市",
"code": "110000",
"areaArr": [
{
"name": "朝阳区",
"code": "110105"
},
{
"name": "海淀区",
"code": "110108"
},
{
"name": "东城区",
"code": "110101"
},
{
"name": "西城区",
"code": "110102"
},
{
"name": "石景山区",
"code": "110107"
},
{
"name": "丰台区",
"code": "110106"
},
{
"name": "通州区",
"code": "110112"
},
{
"name": "昌平区",
"code": "110114"
},
{
"name": "大兴区",
"code": "110115"
},
{
"name": "怀柔区",
"code": "110116"
},
{
"name": "顺义区",
"code": "110113"
},
{
"name": "平谷区",
"code": "110117"
},
{
"name": "房山区",
"code": "110111"
},
{
"name": "门头沟区",
"code": "110109"
},
{
"name": "密云县",
"code": "110228"
},
{
"name": "延庆县",
"code": "110229"
}
]
}
]
}
]
目前追踪到:
/com/alibaba/fastjson/JSON.java:339 行 参数clazz
kotlin 参数为 : java.util.List extends com.cfzx.api.util.Address>
java 参数为: java.util.List
导致的问题
似乎是kotlin自动加上泛型的上限导致,Address类没有子类.所以解析有问题.不知道有没有什么参数设置可以解决这个问题
/com/alibaba/fastjson/parser/ParserConfig.java:311
type 类型为 ? extends com.cfzx.api.util.Address 所以判断为false
type 类型为 WildcardType 实现类为WildcardTypeImpl
已经支持,预计在春节前发布新版本1.2.24
1.2.24已经发布,请用新版本
https://github.com/alibaba/fastjson/releases/tag/1.1.62.android
https://github.com/alibaba/fastjson/releases/tag/1.2.37
1.1.62.android & 1.2.37发布,增强了对kotlin的支持
@Ccixyj
Most helpful comment
已经支持,预计在春节前发布新版本1.2.24