2

Say I have the following json string:

{
    "name": "Foo"
    "pic1": "some pic 1",
    "pic2": "some pic 2",
    "pic3": "some pic 3",
    ...
    "picn": "some pic n"
}

I need to create following POJO:

class Foo {
  String name;
  String[] pics;
}

from this string.

The trick is I need to map pic* to String[] pics somehow.

How can I do that using Jackson?

corvax
  • 1,095
  • 1
  • 10
  • 35
  • @JonnyHenly , no, the question you've suggested relates to building list of objects with predefined structure. I need to create list of values property in single object based on pattern. – corvax Dec 06 '16 at 20:18

1 Answers1

2

Add your own custom serializer and deserializer.

@JsonSerialize(using = MySerializer.class)
@JsonDeserialize(using = MyDeSerializer.class)
public class Foo {
    private String name;
    private String[] pics;

Serializer:

public class MySerializer extends JsonSerializer<Foo> {

    @Override
    public void serialize(Foo value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
        int i = 1;
        String fieldName = "pics";
        jgen.writeStartObject();
        jgen.writeStringField("name", value.getName());
        for (String stringValue : value.getPics()) {
            jgen.writeStringField(fieldName + i, stringValue);
            i++;
        }
        jgen.writeEndObject();

    }

}

Deserializer:

public class MyDeSerializer extends JsonDeserializer<Foo> {

    @Override
    public Foo deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        ObjectCodec objectCodec = jp.getCodec();
        Foo foo = new Foo();
        JsonNode node = objectCodec.readTree(jp);

        Iterator<Entry<String, JsonNode>> fields = node.fields();
        String[] pics = new String[node.size() - 1];

        int i = 0;
        while (fields.hasNext()) {
            Entry<String, JsonNode> next = fields.next();
            if (next.getKey().equalsIgnoreCase("name"))
                foo.setName(node.get("name").asText());
            else {
                pics[i] = node.get(next.getKey()).asText();
                i++;
            }
        }
        foo.setPics(pics);
        return foo;
    }
}
kleash
  • 1,211
  • 1
  • 12
  • 31