2015-12-02 113 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可能会混淆它。 –