alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.74k stars 484 forks source link

[QUESTION]JSONObject.toJSONString 序列化乱序,没有按照对象属性的顺序来显示 #2443

Open volicy opened 6 months ago

volicy commented 6 months ago

现在有个需求页面展示的顺序和对象属性顺序一致,但是JSONObject.toJSONString后乱序了,原有的SerializerFeature.SortField被移除了,目前这个版本我该如何配置??

wenshao commented 6 months ago

JSONWriter.Feature.SortMapEntriesByKeys 看下这个

volicy commented 6 months ago

不行,加了这个还是乱序 JSONObject.toJSONString(xx, JSONWriter.Feature.SortMapEntriesByKeys);

我的key都是中文,使用了@JSONField做了中文别名配置,和这个是否有关系??

wenshao commented 6 months ago

能帮忙构建一个重现问题的testcase么?

volicy commented 6 months ago
public class Test {

   @Getter 
    @Setter
    static class  User{
        @JSONField(name = "登录名")
        String loginName  = "";
        @JSONField(name = "用户名")
        String userName = "";
        @JSONField(name = "年龄")
        String userAge = "";
        @JSONField(name = "性别")
        String userSex = "";
        @JSONField(name = "出生日期")
        String userBithday = "";
    }

    public static void main(String[] args) {
        User user = new User();
        System.out.println(JSON.toJSONString(user));
        //乱序了
        //{"出生日期":"","年龄":"","性别":"","用户名":"","登录名":""}

        //我想要的是按照类的属性顺序显示
        //{"登录名":"","用户名":"","年龄":"","性别":"","出生日期":""}
    }
}
wenshao commented 6 months ago

可以使用JSONType#orders来指定顺序

   @Test
    public void test() {
        User user = new User();
        assertEquals("{\"登录名\":\"\",\"用户名\":\"\",\"年龄\":\"\",\"性别\":\"\",\"出生日期\":\"\"}", JSON.toJSONString(user));
    }

    @JSONType(orders = {"登录名", "用户名", "年龄", "性别", "出生日期"})
    @Getter
    @Setter
    static class User {
        @JSONField(name = "登录名")
        String loginName = "";
        @JSONField(name = "用户名")
        String userName = "";
        @JSONField(name = "年龄")
        String userAge = "";
        @JSONField(name = "性别")
        String userSex = "";
        @JSONField(name = "出生日期")
        String userBithday = "";
    }
volicy commented 6 months ago

有没有更方便的处理方式,我有一百多个属性

wenshao commented 6 months ago

也可以在JSONField#ordinal中指定输出顺序

    @Test
    public void test1() {
        User1 user = new User1();
        assertEquals(
                "{\"登录名\":\"\",\"用户名\":\"\",\"年龄\":\"\",\"性别\":\"\",\"出生日期\":\"\"}",
                JSON.toJSONString(user));
    }

    @Getter
    @Setter
    static class User1 {
        @JSONField(name = "登录名", ordinal = 1)
        String loginName = "";
        @JSONField(name = "用户名", ordinal = 2)
        String userName = "";
        @JSONField(name = "年龄", ordinal = 3)
        String userAge = "";
        @JSONField(name = "性别", ordinal = 4)
        String userSex = "";
        @JSONField(name = "出生日期", ordinal = 5)
        String userBithday = "";
    }
Xueyu334 commented 3 months ago

不知道为什么不会按照属性声明的顺序进行排序 希望后续可以增加这个功能 现在写起来比较费解 字段太多了的时候 手动声明顺序是实在是太麻烦了