fastjson 使用JSONObject.toJavaObject(JSON.parseObject("{\"typeCharKey\":\"0\"}", Type.class),对象内有Character属性转换异常,

sg24os4d  于 2022-10-21  发布在  Java
关注(0)|答案(2)|浏览(1333)

使用JSONObject.toJavaObject(JSON.parseObject("{"typeCharKey":"0"}", Type.class),对象内有Character属性转换异常。
public class Type{
private Character typeCharKey;
}
若json里typeCharKey的值是0之类的数字,就会抛出异常com.alibaba.fastjson.JSONException: can not cast to char, value : 0。因为会把"0"转成int类型,转换失败。
若json里typeCharKey的值是a之类的字符,就会转换正常。
1.2.71版本验证过都是正常的。

oxosxuxt

oxosxuxt1#

请帮解决下该问题,升级版本被这个问题阻塞了。 @wenshao

1.2.75是OK的,1.2.76就出问题了。
看了下代码,是JavaBeanDeserializer里的代码改动导致的,截图如下:

原来会对value进行toJSONString后再传给parser,现在如果是String就跳过这个过程了。所以导致如果是char的'0'被后续解析成int的0,触发上面提到的”com.alibaba.fastjson.JSONException: can not cast to char, value : 0“异常。

提供一段简单的测试代码:

public static class A {

        private String s;
        private Character c;

        public String getS() {
            return s;
        }
        public void setS(String s) {
            this.s = s;
        }
        public Character getC() {
            return c;
        }
        public void setC(Character c) {
            this.c = c;
        }

        @Override
        public String toString() {
            return "A{" + "s='" + s + '\'' + ", c=" + c + '}';
        }
    }

    public static void main(String[] args) {
        A a = new A();
        a.s = "str";
        a.c = '0';
        String js = JSON.toJSONString(a);
        System.out.println(js);
        JSONArray jsa = JSON.parseArray("[" + js + "]");
        List<A> as = jsa.toJavaList(A.class);
        System.out.println(as);
    }
tjrkku2a

tjrkku2a2#

@wenshao 和楼主同样的问题,不升级无法解决漏洞,升级的话,toJavaObject报错

相关问题