fastjson toJSONString() 属性排序

最近使用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、有没有全局的配置,来取消属性排序的功能?

阅读 18.8k
2 个回答

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

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题