我有一个以下类
的对象数组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并使用jackson序列化此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 :(得分:3)
我不认为这是你可以告诉杰克逊要做的事情。
我能想到的最简单的解决方案是将你得到的数组变成HashMap<Integer, Person>
并将其传递给杰克逊。
如果订单很重要(您希望&#34; 1&#34;在&#34; 2&#34;之前),那么您可以使用LinkedHashMap<Integer, Person>
这样的事情:
HashMap<Integer, Person> pMap = new HashMap<>();
for(int i = 0; i < persons.size(); i++){
pMap.put(i, persons.get(i));
}
修改: 事实证明你可以做到这一点,你只需要自己编写序列化器 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();
}
}
你可以通过简单地向Person类
添加一个antotation来告诉jackson使用这个序列化器@JsonSerialize(using = PersonSerializer.class)
public class Person
{
private Long id;
private String name;
//Rest of the getters and setters
}