Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kotlin中使用泛型解析的问题 #998

Closed
Ccixyj opened this issue Jan 16, 2017 · 4 comments
Closed

kotlin中使用泛型解析的问题 #998

Ccixyj opened this issue Jan 16, 2017 · 4 comments
Labels

Comments

@Ccixyj
Copy link

Ccixyj commented Jan 16, 2017

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<? extends com.cfzx.api.util.Address>
java 参数为: java.util.List<com.cfzx.api.util.Address>
导致的问题

@Ccixyj
Copy link
Author

Ccixyj commented Jan 16, 2017

似乎是kotlin自动加上泛型的上限导致,Address类没有子类.所以解析有问题.不知道有没有什么参数设置可以解决这个问题

/com/alibaba/fastjson/parser/ParserConfig.java:311
type 类型为 ? extends com.cfzx.api.util.Address 所以判断为false
type 类型为 WildcardType 实现类为WildcardTypeImpl

@wenshao
Copy link
Member

wenshao commented Jan 17, 2017

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

@wenshao
Copy link
Member

wenshao commented Jan 20, 2017

1.2.24已经发布,请用新版本

@wenshao wenshao closed this as completed Jan 20, 2017
@wenshao
Copy link
Member

wenshao commented Aug 17, 2017

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants