[alibaba/fastjson]解析以get 或set开头的方法,但是字段实际是不存在的,导致反序列化时报错

2025-10-31 351 views
0

例如下面的类:

public class User {
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void getMyAge() {
        return age;
    }
}

使用JSON.toJSONString()时,会把myAge解析为字段,导致使用JSON.parseObject时报错。

具体就是这一行没有判断field是否为null https://github.com/alibaba/fastjson/blob/0c15a7408c685af670547b0bb97336fbf34f9731/src/main/java/com/alibaba/fastjson/util/TypeUtils.java#L1670

回答

4

报错信息提供一下?

9

@wenshao 这是toJSONString之前的对象数据

这是转之后的String

这里的tableFields字段实际上是一个getTableFields方法,并没有字段

com.alibaba.fastjson.JSONException: set property error, tableFields
    at com.alibaba.fastjson.parser.deserializer.FieldDeserializer.setValue(FieldDeserializer.java:162) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseField(ArrayListTypeFieldDeserializer.java:71) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:1149) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:801) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:273) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:269) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_14_SqlDesc.deserialze(Unknown Source) ~[na:na]
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:269) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:758) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.serializer.ObjectArrayCodec.deserialze(ObjectArrayCodec.java:183) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_13_RuntimeContext.deserialze(Unknown Source) ~[na:na]
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:269) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:671) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:365) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:269) ~[fastjson-1.2.49.jar:na]
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:488) ~[fastjson-1.2.49.jar:na]
4

我之前也有这样的问题。 只要是get set开头的方法都会执行,不管有没有对应属性。 上次就因为起了一个getXxx 在里面进行了很多操作,导致序列化之后的对象属性已经不一样了。

0

我也碰到了相同的问题

2

同样遇到有get开头, 但是无field的异常逻辑情况, 望修复