Fastjson: kotlin中使用泛型解析的问题

Created on 16 Jan 2017  ·  4Comments  ·  Source: alibaba/fastjson

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);
    }

结果正确解析了
javaresult
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)
    }

结果解析失败
ktreult

实体类

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
java 参数为: java.util.List
导致的问题

bug

Most helpful comment

已经支持,预计在春节前发布新版本1.2.24

All 4 comments

似乎是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已经发布,请用新版本

Was this page helpful?
0 / 5 - 0 ratings