fastjson toJSONString() 属性排序

发布于 2022-09-02 13:34:47 字数 1534 浏览 18 评论 0

最近使用fastjson序列化对象时,发现输出的json字符串中是按属性进行了排序。

public class Person {
    private String name;
    private Integer age;
    private String gender;
    private Double height;
    private Double weight;
    //省略get,set方法
}
public class FastJsonTest {

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("Tom");
        person.setAge(20);
        person.setGender("Male");
        person.setHeight(180.5);
        person.setWeight(80.5);
        
        System.out.println(JSON.toJSONString(person));
    }
}

输出:

{"age":20,"gender":"Male","height":180.5,"name":"Tom","weight":80.5}

通过@JSONType,@JSONField注解可以定义属性的顺序

@JSONType(orders={"name","age","gender","height","weight"})
public class Person {
    private String name;
    private Integer age;
    private String gender;
    private Double height;
    private Double weight;
}

或者

public class Person {
    @JSONField(ordinal = 1)
    private String name;
    @JSONField(ordinal = 2)
    private Integer age;
    @JSONField(ordinal = 3)
    private String gender;
    @JSONField(ordinal = 4)
    private Double height;
    @JSONField(ordinal = 5)
    private Double weight;
}

输出:

{"name":"Tom","age":20,"gender":"Male","height":180.5,"weight":80.5}


如果每个VO都显示的指定顺序会比较繁琐。所以,我的问题是:
1、fastjson设计为按顺序输出的目的是什么?

2、有没有全局的配置,来取消属性排序的功能?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

山有枢 2022-09-09 13:34:48

1.2.3版本后的FastJson没有这个问题

桃酥萝莉 2022-09-09 13:34:48

回答一下第一个问题:
1、fastjson设计为按顺序输出的目的是什么?
这样可以方便比较pojo内容是否一致,把两个pojo toJSONString之后,compare一下两个string是否一致。如果没有排序,而是按照pojo定义类的属性顺序,可能有这种情况:两个类有公共字段,并且在公共字段上内容一致,非公共字段都为空,那我们可以逻辑上理解为这两个对象表达的意义是类似的(存储的内容一致),但是他们在定义时属性顺序不一致,那么toJSONString然后再compare会发现不一样,而且DB中存储jsonString的场景也很常见

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文