fastjson 1.1.57.android 为何会支持格式不对的List的解析?

zlwx9yxi  于 2022-10-22  发布在  Android
关注(0)|答案(3)|浏览(188)

测试用例:

@RunWith(JUnit4.class)
public class JSONParseTest{
    @Test
    public void parse() throws Exception {
        final Object parsed = JSON.parse("{\"data\":{}}");
        assertThat(parsed, instanceOf(JSONObject.class));
        assertThat(((JSONObject)parsed).get("data"), instanceOf(JSONObject.class));

        final Result<Data> result = JSON.parseObject("{\"data\":{}}", new TypeReference<Result<Data>>(){});
        assertThat(result.data, notNullValue());
        assertThat(result.data, instanceOf(Data.class));

        final Result<List<Data>> result2 = JSON.parseObject("{\"data\":[]}", new TypeReference<Result<List<Data>>>(){});
        assertThat(result2.data, notNullValue());
        assertThat(result2.data, instanceOf(List.class));
        assertThat(result2.data.size(), is(0));
    }

    @Test(expected = JSONException.class)
    public void parseErr() throws Exception {
        JSON.parseObject("{\"data\":{}}", new TypeReference<Result<List<Data>>>(){});
        fail("should be failed due to error json");
    }

    public static class Result<T>{
        T data;
        public void setData(T data) {
            this.data = data;
        }
        public T getData() {
            return data;
        }
    }
    public static class Data {
    }
}

预期的结果: {"data":{}} 解析到 Result<List<Data>> 时,应抛异常。

239c6a6
经debug发现是上面的commit引入的代码逻辑

希望可以有办法关闭这种“隐藏”的令人困惑的兼容逻辑

emeijp43

emeijp431#

确实存在,JSON.parseObject里对{},直接初始化对象放到list里了。
JSON.parseObject+jsonObject.toJavaObject则是先把{}转成JSONObject对象,再转换就出错了。

2skhul33

2skhul332#

建议消除的办法:
1、遵守规范,{}单个对象转List不允许
2、再让这两个行为一致

rks48beu

rks48beu3#

这个是特性,不是bug

相关问题