fastjson 序列化时如何保持字段定义顺序

一、序列化对象成字符串时,如何自定义属性名

使用 com.alibaba.fastjson.annotation.JSONField 注解即可

@Data
public class StudentDto {
    @JSONField(name="my_name")
    private String name;
    
    @JSONField(name="my_age")
    private Integer age;
}

序列化结果为:
{“my_age”:10,“my_name”:“zhangsan”}

二、序列化对象成字符串时,如何保持属性定义的顺序

如上的执行结果,是按照字母顺序排列的, my_age 在 my_name 前面,和我们的定义顺序不一样。

经过我多方查找,终于发现了解决方案:

答案来源:https://github.com/alibaba/fastjson/issues/3115

结论:

JSON.DEFAULT_GENERATE_FEATURE &= ~SerializerFeature.SortField.getMask();
SerializeConfig serializeConfig = new SerializeConfig(true);
System.out.println(JSON.toJSONString(javaObject, serializeConfig));

执行结果为:

{“my_name”:“zhangsan”,“my_age”:10}

符合预期

三、序列号 JSONObject 时,如何保持字段加入的顺序

如下面的例子:

@Test
public void test1() {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("c", 10);
    jsonObject.put("a", 11);
    jsonObject.put("d", 12);
    jsonObject.put("b", 13);
    System.out.println(JSON.toJSON(jsonObject));
}

执行结果为:

{“a”:11,“b”:13,“c”:10,“d”:12}

发现不是按我们加入的顺序来序列化的,只需要在新建 JSONObject 对象时,给它指定容器即可

JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());

此时执行结果为:

{“c”:10,“a”:11,“d”:12,“b”:13}

符合预期

你可能感兴趣的:(开发问题汇总,json,java,开发语言,fastjson)