如何使用jackson将JSON数组序列化为带编号/索引的JSON?

时间:2015-07-29 16:50:36

标签: java json serialization jackson

我有一个以下类

的对象数组
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"
            }
        }
    }
}

1 个答案:

答案 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

}