[alibaba/fastjson]1.1.57.android 带泛型的多层继承类的解析bug

2025-11-25 487 views
2

类似testcase Bug_for_generic_huansi.java 但在第二层继承的时候嵌套了List

@RunWith(JUnit4.class)
public class GenericObjectJsonParseTest {

    @Test
    public void parseObject() {
        assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
                new TypeReference<BaseGenericType<List<String>>>(){}).data.get(1));
        assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
                new TypeReference<ExtendGenericType<String>>(){}).data.get(1));
        assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"],\"a\":\"a\"}",
                SimpleGenericObject.class).data.get(1));
    }

    static class BaseGenericType<T> {
        public T data;
    }

    static class ExtendGenericType<T> extends BaseGenericType<List<T>> {
    }

    static class SimpleGenericObject extends ExtendGenericType<String> {
    }
}

在解析SimpleGenericObject类的时候单元测试失败: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List

回答

6

最后一个断言里多了一个a属性

6

@kimmking 呃是测试的时候多加的,贴上来忘删了。但即使有多余的字段也不应会影响不是吗?

0
@RunWith(JUnit4.class)
public class GenericObjectJsonParseTest {

    @Test
    public void parseObject1() {
        assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
                new TypeReference<BaseGenericType<List<String>>>() {
                }).data.get(1));
    }

    @Test
    public void parseObject2() {
        assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
                new TypeReference<ExtendGenericType<String>>() {
                }).data.get(1));
    }

    @Test
    public void parseObject3() {
        assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
                SimpleGenericObject.class).data.get(1));
    }

    @Test
    public void parseObject4() {
        assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
                SimpleGenericObjectWithJSONCreator.class).data.get(1));
    }

    @Test
    public void parseObject5() {
        assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
                SimpleGenericObjectWithJSONCreatorFactory.class).data.get(1));
    }

    static class BaseGenericType<T> {
        public T data;
    }

    static class ExtendGenericType<T> extends BaseGenericType<List<T>> {
    }

    static class SimpleGenericObject extends ExtendGenericType<String> {
    }

    static class SimpleGenericObjectWithJSONCreator extends ExtendGenericType<String> {

        @JSONCreator
        public SimpleGenericObjectWithJSONCreator(
                @JSONField(name = "data") List<String> data) {
            this.data = data;
        }
    }

    static class SimpleGenericObjectWithJSONCreatorFactory extends ExtendGenericType<String> {

        @JSONCreator
        public static SimpleGenericObjectWithJSONCreatorFactory create(
                @JSONField(name = "data") List<String> data) {
            SimpleGenericObjectWithJSONCreatorFactory o
                    = new SimpleGenericObjectWithJSONCreatorFactory();
            o.data = data;
            return o;
        }
    }
}

我更新了一下单元测试,parseObject3()parseObject5() 是验证不通过的:java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List

2

类型计算错误了。。。