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?

1
  • @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. Commented Dec 6, 2016 at 20:18

1 Answer 1

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;
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.