测试用例:
@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引入的代码逻辑
希望可以有办法关闭这种“隐藏”的令人困惑的兼容逻辑
3条答案
按热度按时间emeijp431#
确实存在,JSON.parseObject里对{},直接初始化对象放到list里了。
JSON.parseObject+jsonObject.toJavaObject则是先把{}转成JSONObject对象,再转换就出错了。
2skhul332#
建议消除的办法:
1、遵守规范,{}单个对象转List不允许
2、再让这两个行为一致
rks48beu3#
这个是特性,不是bug