2015-12-02 4 views
2

Я хотел бы знать, можно ли создать объект JSON с помощью JsonSerializer от Jackson, где свойства упорядочены по значению (не по ключу). Например:Сериализовать свойства объекта в пользовательском порядке с помощью Jackson

{ 
    "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 генерируется не отсортирован по стоимости недвижимости, Джексон должен быть разупорядочения снова свойства объекта. Есть ли способ достичь этого?


EDIT: Проблемы была не с Джексоном, но с приложением я использовал для извлечения JSON (CocoaRestClient), который изменяет порядок следования свойств в сгенерированном объекте. И мой подход, и @m.aibin's являются правильными. Если у вас есть подобная проблема, проверьте, что проблема не в приложении, которое вы используете для извлечения JSON.

+1

Порядок свойств не имеет значения, за исключением, может быть * * в целях удобочитаемости человека. –

ответ

1

Вы можете отсортировать вашу карту, а затем сериализовать ее. С Jackson 2.3.1 вы можете сериализовать SortedMap, например LinkedHashMap, порядок будет соблюдаться.

Ссылка как сортировать хэш-карту, например, здесь: Sorting HashMap by values

+0

Спасибо за ответ m.aibin. Я создал SortedMap, а затем сериализовал его, но результат по-прежнему не упорядочен ни по значению, ни по ключу. Джексон мог игнорировать этот приказ. –

+0

@Javi Fernandez, но вы отсортировали эту карту? По умолчанию это не отсортировано, это реализация Map, которая сохраняет порядок, в который были вставлены ключи на карте, вам нужно отсортировать и вернуть новую отсортированную карту, а затем сериализовать ее. –

+0

Да, я отсортировал карту. Я попробовал несколько подходов: создание «SortedMap», создание «LinkedHashMap» (с кодом в ответе, которое вы связали) и даже создание «списка» (как описано в вопросе), но ни одна из них не работала. Свойства сортируются в объекте, но не в 'JSON', поэтому я думаю, что Джексон может его разупорядочить. –