jackson - 如何在 Jackson 中订购哈希集? @JsonPropertyOrder 不起作用

标签 jackson spring-roo hashset

我有两个实体:调查和信息。

调查实体:

@RooJavaBean
@RooToString
@RooJpaActiveRecord(table = "information")
@JsonPropertyOrder({ "seq"})
public class Information {

    @NotNull
    private String title;

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonBackReference
    private Survey survey;

    private int seq;
}

信息实体:

@RooJavaBean
@RooToString
@RooJpaActiveRecord(table = "survey")
public class Survey {
    @NotNull
    @Size(min = 3, max = 50)
    private String title;  

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="survey")
    @JsonManagedReference
    private Set<Information> informations = new HashSet<Information>();

}

我使用 jackson 进行序列化。

我的期望:

{
  "survey" : {
    "title" : "Medical Survey",
    "informations" : [ {
      "id" : 1,
      "seq" : 0,
      "title" : "Name:",
      "version" : 0
    }, {
      "id" : 2,
      "seq" : 1,
      "title" : "Age:",
      "version" : 0
    },  {
      "id" : 3,
      "seq" : 2,
      "title" : "test",
      "version" : 0
    }, {
      "id" : 4,
      "seq" : 3,
      "title" : "test",
      "version" : 0
    } ],
    "id" : 1,
    "version" : 134
  }
}

但结果是:

{
  "survey" : {
    "title" : "Medical Survey",
    "informations" : [ {
      "id" : 2,
      "seq" : 1,
      "title" : "Age:",
      "version" : 0
    }, {
      "id" : 4,
      "seq" : 3,
      "title" : "test",
      "version" : 0
    }, {
      "id" : 3,
      "seq" : 2,
      "title" : "test",
      "version" : 0
    }, {
      "id" : 1,
      "seq" : 0,
      "title" : "Name:",
      "version" : 0
    } ],
    "id" : 1,
    "version" : 134
  }
}
  1. 我知道在这种情况下使用列表应该更合适,但 Spring Roo 不支持脚手架中的列表。因此,我使用了带有 seq 号的 HashSet。
  2. 我还知道我可以创建一个信息数组列表为@transient,然后克隆 并在业务层进行排序。

但是我想知道是否有更干净的解决方案,即序列化时排序。谢谢。

最佳答案

HashSet 无法排序,这只是正常的 java 行为。您正在寻找的是 TreeSet。为其提供一个 Comparator,或者在您的信息类中实现 Comparable,您的 Json 将会被排序。

关于jackson - 如何在 Jackson 中订购哈希集? @JsonPropertyOrder 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15659167/

相关文章:

java - 使用 Spring Roo 的 Hibernate OrderColumn

java - 迭代集合

java - HashSet允许多个项目具有相同的HashCode

java - 如何使用 Jackson 自动解析 Spring Boot 应用程序中的 JSON

java - 使用 Jackson 序列化为 JSON 时如何在 Java Map 中转换 Java List

spring - Postgresql 和 Spring Roo 为 ID 绑定(bind)序列类型

java - Spring Roo 和 Hibernate : how to prevent deletion

java - 无法读取 JSON : Current token (VALUE_STRING) not numeric, 无法使用数值访问器

java - Jackson(JSON 库)可以自动生成用于反序列化的 POJO 吗?

linq - 什么是创建独特的数据结构更好的方法:HashSet或Linq的Distinct()?