2015-07-29 2 views
0

У меня есть массив объектов в следующий классКак сериализовать массив JSON как пронумерованный/индексированный JSON с использованием джексона?

public class Person 
{ 
    private Long id; 
    private String name; 
    //Rest of the getters and setters 

} 

public class Data 
{ 
    private ArrayList<Person> persons; 

    public Data() 
    { 
      persons = new ArrayList<Person>(); 
      Person p1 = new Person(1L, "walter"); 
      Person p2 = new Person(2L, "white"); 
      persons.add(p1); 
      persons.add(p2); 
    } 
} 

Теперь, если я создаю объект данных в моей программе и сериализовать этот Data объект с Джексоном, он даст мне следующий JSON.

{ 
    "data": { 
     "persons": [ 
      { 
       "id": 1, 
       "name": "walter" 
      }, 
      { 
       "id": 2, 
       "name": "white" 
      } 
     ] 
    } 
} 

есть ли способ сериализации этого объекта в следующий пронумерованный/индексированный JSON?

{ 
    "data": { 
     "persons": { 
      "1": { 
       "id": 1, 
       "name": "walter" 
      }, 
      "2": { 
       "id": 2, 
       "name": "white" 
      } 
     } 
    } 
} 
+0

почему бы не сделать 'ArrayList человек;' а 'HashMap ' или 'LinkedHashMap 'если порядок имеет значение? – Epicblood

+0

@Epicblood: порядок здесь не имеет значения. Я просто хочу пронумерованный массив. В основном это всего лишь пример, который я написал. В моем случае использования у меня есть входящие данные в формате массива, но я должен записать эти данные в индексированном/numbred формате. – Heisenberg

+0

Я не думаю, что у Jackson есть эта функция, я бы поставил массив, который вы получите через каждый цикл, и превратите его в hashmap. – Epicblood

ответ

3

Я не думаю, что это то, что вы можете просто сказать Джексон делать.

Самое легкое решение, о котором я могу думать, это превратить массив, который вы получаете в HashMap<Integer, Person>, и передать его в джексон.

Если порядок имеет значение (вы хотите "1", чтобы быть перед "2"), то вы можете использовать LinkedHashMap<Integer, Person>

Что-то вроде этого:

HashMap<Integer, Person> pMap = new HashMap<>(); 
for(int i = 0; i < persons.size(); i++){ 
    pMap.put(i, persons.get(i)); 
} 

Edit: Оказывается, вы можете сделать это, вы просто должны написать сериалайзер сами1, так что вы могли бы сделать что-то вроде:

public class PersonSerializer extends JsonSerializer<Person> { 
    @Override 
    public void serialize(Person person, JsonGenerator jgen, SerializerProvider provider) 
     throws IOException, JsonProcessingException { 
     jgen.writeStartObject(String.valueOf(i)); 
     jgen.writeNumberField("id", i); 
     jgen.writeStringField("name", person.getName()); 
     jgen.writeEndObject(); 
    } 
} 

Вы можете сказать Джексону, чтобы использовать эту сериалайзер, просто добавляя antotation к Person класса

@JsonSerialize(using = PersonSerializer.class) 
public class Person 
{ 
    private Long id; 
    private String name; 
    //Rest of the getters and setters 

} 
Смежные вопросы