2015-12-02 83 views
2

我想知道是否有可能生成一個JSON對象與傑克遜的JsonSerializer其中的屬性按值排序(而不是按鍵)。例如:按照自定義順序序列化對象屬性與傑克遜

{ 
    "property2": 320, 
    "property1": 287, 
    "property4": 280, 
    "property3": 123, 
    ... 
} 

我試圖生成它創建自定義JsonSerializer這樣的:

public class MySerializer extends JsonSerializer<Map<String, Long>> { 

    @Override 
    public void serialize(Map<String, Long> t, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException { 
     List<Entry<String, Long>> list = new ArrayList<>(t.entrySet()); 
     Collections.sort(list, new Comparator<Map.Entry<String, Long>>() { 
      @Override 
      public int compare(Map.Entry<String, Long> o1, Map.Entry<String, Long> o2) { 
       return o2.getValue().compareTo(o1.getValue()); 
      } 
     }); 
     jg.writeStartObject(); 
     for(Entry<String, Long> entry : list) { 
      jg.writeNumberField(entry.getKey(), entry.getValue()); 
     } 
     jg.writeEndObject(); 
    } 
} 

但JSON產生不受屬性值進行排序,傑克遜必須再次無序對象屬性。有什麼辦法可以做到這一點?


編輯:問題不與傑克遜,但與應用程序I用於檢索JSON(CocoaRestClient),這改變了在所生成的對象的屬性的順序。我的方法和@ m.aibin的方法都是正確的。 如果您有類似問題,請檢查問題不在於您用於檢索JSON的應用程序。

+1

屬性的順序應該從來不管,除了*也許*易讀性的目的。 –

回答

1

你可以對你的地圖進行排序,然後序列化它。使用Jackson 2.3.1,您可以序列化一個SortedMap,例如一個LinkedHashMap,順序將得到遵守。

鏈接如何排序的哈希圖是這裏舉例:Sorting HashMap by values

+0

謝謝你回答m.aibin。我創建了一個SortedMap,然後序列化它,但結果仍然沒有排序,無論是按值還是按鍵。傑克遜可能會無視這一命令。 –

+0

@Javi Fernandez,但你整理了這張地圖嗎?它沒有默認排序,這是Map的一個實現,它保持鍵被插入到地圖中的順序,您需要排序並返回一個新的有序地圖,然後將其序列化 –

+0

是的,我對地圖進行了排序。我嘗試了幾種方法:創建一個'SortedMap',創建一個'LinkedHashMap'(與你鏈接的答案中的代碼),甚至創建一個'List'(如問題中所述),但它們都不起作用。這些屬性在對象中排序,但不在'JSON'中,所以我認爲Jackson可能會混淆它。 –