[alibaba/fastjson]JSON.parseObject(json, class)和jsonObject.toJavaObject(class)结果不一致,并且都是错误的

2025-11-25 711 views
2
compile 'com.alibaba:fastjson:1.2.31'
compile 'com.alibaba:fastjson:1.1.57.android'

有如下json字符串和类:

String t2 = "{\"state\":2,\"msg\":\"msg2222\",\"data\":{}}";
    public static class Test {
        public int state;
        public String msg;
        public List<Data> data;
        public static class Data {
            public int d1;
            public String d2;
        }
    }

测试代码如下:

        try {
            Test c2 = JSON.parseObject(t2, Test.class);
            Log.d("JSON", "c2 ----");
            com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(t2);
            Test model = jsonObject.toJavaObject(Test.class);
            Log.d("JSON", "model ----");
        } catch ( Exception e) {
            e.printStackTrace();
        }

c2可以格式化出结果,但结果是错误的, c2 = {MainActivity$Test@830029442312} data = {ArrayList@830029442520} size = 1 0 = {MainActivity$Test$Data@830029442600} d2 = null d1 = 0 msg = "msg2222" state = 2 model执行出现异常 e = {JSONException@830029375048} "com.alibaba.fastjson.JSONException: can not cast to : java.util.List<com.yyw.fastjson_example.MainActivity$Test$Data>" cause = {JSONException@830029373272} "com.alibaba.fastjson.JSONException: can not cast to : java.util.List<com.yyw.fastjson_example.MainActivity$Test$Data>" detailMessage = "can not cast to : java.util.List<com.yyw.fastjson_example.MainActivity$Test$Data>" stackState = {int[38]@830029375080} stackTrace = {StackTraceElement[0]@830024963328} suppressedExceptions = {Collections$EmptyList@830024961208} size = 0

回答

4

@weicao 要求data为空(不存在或者 "data":{}),输出的List data==null(或size==0) 请问,有没有选项使得忽略“can not cast to”错误?

9

data:{} 与 data ==null 可不等价。 可以试试用data:[],data:null

3

确实存在解析不一致, JSON.parseObject 可以解析,但是List里是一个空的JSONObject,都是{}与[]惹的锅。

0

@kiminotes json字符串是后台返回的,不可更改。 我想要:提供一个参数,发生cast异常时忽略, 这样List data就不会被赋值

1

如果是这样,说明你们后台序列化的库有bug, 建议替换成fastjson之类的,它不会把一个array序列化成{}

5

@kimmking 后台是php的。 如果某个函数返回为null则默认输出data:{}是允许的。 当然最好的情况是data整个都不输出

8

这个问题到现在都还是老样子吗