2013-03-27 12 views
1

我有兩個實體,調查和信息。如何在Jackson中訂購hashset? @JsonPropertyOrder沒有工作

調查實體:

@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>(); 

} 

我用傑克遜序列化。

我想到:

{ 
    "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,然後克隆 並在業務層中進行排序。

但我想知道是否有更清潔的解決方案,即序列化時排序。謝謝。

回答

2

HashSet無法排序,這只是正常的java行爲。你正在尋找的是一個TreeSet。提供一個Comparator,或者在你的信息類中實現Comparable,並且你的Json將被訂購。

+0

這意味着HashSet無法按照使用Jackson的順序排列,對嗎? – 2013-03-27 16:01:29

+0

Jackson無法控制Set的順序,無論是HashSet,TreeSet還是任何其他Set實現。 @JsonPropertyOrder用於排序對象(和映射的程度較低)的Json屬性,而不是Array。你根本無法控制HashSet中對象的順序,這是它設計的一部分。 – 2013-03-27 17:00:54

+0

明白了。非常感謝!! – 2013-03-27 17:25:14