alibaba / fastjson

FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
Apache License 2.0
25.72k stars 6.5k forks source link

多层继承泛型转换失败 #1299

Open coffeeZhang001 opened 7 years ago

coffeeZhang001 commented 7 years ago
public class ServiceResult<T> extends BaseResultDo implements Serializable {
    @JSONField(
        name = "data"
    )
    private T data;

    public ServiceResult() {
    }

    public T getData() {
        return this.data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

public class UnitsSaveResponse<UnitSave> extends ServiceResult<UnitSave> {

    public static class UnitSave implements Serializable {

        private SaveUnitInfo unitInfo;

        private List materials;

        public SaveUnitInfo getUnitInfo() {
            return unitInfo;
        }

        public void setUnitInfo(SaveUnitInfo unitInfo) {
            this.unitInfo = unitInfo;
        }

        public List getMaterials() {
            return materials;
        }

        public void setMaterials(List materials) {
            this.materials = materials;
        }
    }

}

String jsonStr = "{\"code\":201,\"data\":{\"materials\":[{\"material\":\"locale\",\"success\":true,"
            + "\"material_id\":356,\"id\":\"5099\"}],\"unitInfo\":{\"languages\":[\"'en_US'\",\"ru_RU\"],"
            + "\"unitName\":\"PC_ROCKBROS\",\"sceneKey\":\"shop_activity_page\",\"domain\":\"shopcdp.aliexpress"
            + ".com\",\"format\":\"HTML\",\"unitId\":\"1625\",\"id\":1761,\"rootPath\":\"shopcdp\","
            + "\"userId\":\"jianqing.zengjq\",\"platforms\":[\"pc\",\"mobile\"],\"status\":2}},\"success\":true}";

UnitsSaveResponse response = JsonUtil.fromJson(jsonStr, UnitsSaveResponse.class);

正如上面的使用方式,UnitsSaveResponse中的data并不能转换成正常的UnitSave类型。 不知道是怎么回事?

coffeeZhang001 commented 7 years ago

不过测试时发现,如果public class UnitsSaveResponse 这个改成 public class UnitsSaveResponse 又是可以正常转换的。 这里之所以想加上,可能是有点多余,不过也是为了方便调用方清楚里面的类型,还是有一些作用的。

kimmking commented 7 years ago
UnitsSaveResponse<UnitSave>
UnitsSaveResponse<T>

你考虑一下这两种写法。

coffeeZhang001 commented 7 years ago

UnitsSaveResponse extends ServiceResult 这样写可以正常转换。

UnitsSaveResponse extends ServiceResult 这样也是不能正常转换的,里面嵌套的map并不能转换成bean