[Spring]~@JsonPropertyOrder(序列化时字段排序)

作用

序列化时生效,将返回的json按字段排序。

实体类

@JsonPropertyOrder(value = {"time","name"})
public class JsonTestModel {
    String name;
    Date time;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getTime() {
        return time;
    }
    public void setTime(Date time) {
        this.time = time;
    }
}

测试类

public class JsonTests {

    static JsonTestModel testModel;

    @BeforeClass
    public static void setTestModel(){
        JsonTestModel jsonTestModel = new JsonTestModel();
        jsonTestModel.setName("@JsonIgnoreProperties测试");
        jsonTestModel.setTime(new Date());
        testModel = jsonTestModel;
    }

    @Test
    public void test() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        //序列化
        String json = mapper.writeValueAsString(testModel);
        System.out.println(json);
    }

    @AfterClass
    public static void tearDown() {
        testModel = null;
    }

}

测试结果

不加注解

{"name":"@JsonIgnoreProperties测试","time":1575445808075}

加注解

{"time":1575445919216,"name":"@JsonIgnoreProperties测试"}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述 在 SpringBoot 中,当向前端返回一个数组对象,对象里面的键是无序的。通过使用 @JsonPropertyOrder 注解指定键的顺序,但是该注解似乎无效。 问题分析 在 Java 中,Map 接口的实现类 HashMap 是无序的,LinkedHashMap 则是有序的。因此,当使用 @JsonPropertyOrder 注解来指定键的顺序,实际上是针对 LinkedHashMap 的,而不是针对 HashMap。在 SpringBoot 中,默认使用的是 Jackson 库来处理 JSON 数据,Jackson 库在反序列 JSON 数据,会将 JSON 数据转换成 LinkedHashMap 对象,因此 @JsonPropertyOrder 注解对于 LinkedHashMap 是有效的。但是,在将 LinkedHashMap 对象序列成 JSON 数据,Jackson 库会将 LinkedHashMap 对象转换成 HashMap 对象,因此 @JsonPropertyOrder 注解对于 HashMap 是无效的。 解决方法 1. 使用 LinkedHashMap 将对象中的 Map 属性改为 LinkedHashMap 类型,这样在将对象序列成 JSON 数据,Jackson 库不会将 LinkedHashMap 对象转换成 HashMap 对象,@JsonPropertyOrder 注解就可以生效了。 2. 使用 @JsonSerialize 使用 @JsonSerialize 注解,可以指定自定义的序列器来控制 JSON 数据的输出顺序。示例代码如下: ```java @JsonSerialize(using = CustomSerializer.class) public class CustomObject { private Map<String, Object> data; // getter and setter } public class CustomSerializer extends JsonSerializer<CustomObject> { @Override public void serialize(CustomObject value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); LinkedHashMap<String, Object> data = new LinkedHashMap<>(value.getData()); for (Map.Entry<String, Object> entry : data.entrySet()) { gen.writeObjectField(entry.getKey(), entry.getValue()); } gen.writeEndObject(); } } ``` 在 CustomObject 类上,使用 @JsonSerialize 注解指定 CustomSerializer 作为序列器。在 CustomSerializer 中,将 CustomObject 中的 Map 属性转换成 LinkedHashMap,然后遍历 LinkedHashMap,按照指定的顺序输出 JSON 数据,这样就可以实现键有序输出了。 参考链接 1. https://stackoverflow.com/questions/29214776/jsonpropertyorder-not-working-for-json-arrays 2. https://stackoverflow.com/questions/54952412/jsonpropertyorder-not-working-with-spring-boot-2-1-3-and-jackson-2-9-8

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值