[alibaba/fastjson]fastjson反序列化问题

2025-11-03 389 views
7

我上网查了一下 没有找到解决方案

在使用FastJSON将字符串数据转化为java对象时 如何指定属性赋值的顺序 例如

{"id":11,"Name":"阿萨德你","Flag":false}

实体类如下

public class MyJSON {
    private Integer Id;
    private String Name;
    private Boolean Flag;

    public void setId(Integer id) {
        Id = id;
    }

    public void setName(String name) {
        Name = name;
    }

    public void setFlag(Boolean flag) {
        Flag = flag;
    }

    public Integer getId() {
        return Id;
    }

    public String getName() {
        return Name;
    }

    public Boolean getFlag() {
        return Flag;
    }

    public MyJSON(Integer id, String name, Boolean flag) {
        Id = id;
        Name = name;
        Flag = flag;
    }

}

在使用

JSON.parseObject("{\"id\":11,\"Name\":\"阿萨德你\",\"Flag\":false}",MyJSON.class)

先对 id赋值 其次为Name赋值 最后为Flag赋值 或者 先对 Name赋值 其次为Flag赋值 最后为id赋值 我使用了@JSONField(ordinal = 1)分别作用在属性和属性的set方法上均不能达到预期效果 谢谢

回答

2

大概知道你的意思了。 能问一下为什么会有这种需求吗,不按顺序赋值对你的程序有影响吗?

3

在部分需求中是有影响;假如有一个需求是 如果flag(上述实体类中的Flag变量 代表性别)是MAN, 在对name(上述实体类中的Name变量 代表性别) 赋值时需要将name属性进行部分美化或者隐藏, 如将属性name为 c-s-t-z 美化为 c@s@t@z , 如果Flag是WOMAN 则将name属性的c-s-t-z美化为 c#s#t#z;

如果先对name属性赋值 就无法在setName中进行Flag属性的判断 ;所以需要先对 Flag赋值 然后在对Name赋值; 在setName方法中可以对Flag属性进行判断之后,对name进行针对行的美化或者隐藏.

以上 是我的补充说明 谢谢您的回复和解答

4

可以考虑设计: 美化操作不放到setter里,而是放到getter里。

9

可以讲一下 JSON.parseObject 为变量赋值的逻辑吗 ? 因为在设计时 实体类中没有get方法 set完之后 会直接调用实体类中一个自定义方法(如MyTest) 直接将数据进行了处理在set时 必须对传进来的参数进行处理 如果再次在MyTest中进行处理 会对维护不利 而且实体类属性过多时 在set中处理要更清晰

现在JSON.parseObject时没有提供顺序赋值自定义的feature之类的机制吗 ?

谢谢您耐心回答和提供的思路

7

getter的时候做就行了. 这种需求如果开发不按顺序setter 也容易出BUG

0

@c-s-t-z 没有提供机制 fastjson为了保证高效率,在顺序这一块做了一些假设。

同时,我们认为实体类应该是POJO,如果加一些判断、处理、关联、校验, 应该在其上加一层来做,比如“实体类中一个自定义方法(如MyTest) ”, 在其中可以根据flag标识,判断name的值。

7

好的 也就是说现在不能自定义赋值顺序是吗 , 以后版本由于性能原因也不会加入对吗

谢谢您的耐心解答

4

这种需求超出职责范围了吧。