0

I need to decode the following JSON-Structure:

{
  "id":1
  "categories": [
    value_of_category1,
    value_of_category2,
    value_of_category3
  ]
}

The object I am trying to deserialize into is of the following class:

class MyClass {
  public Integer id;
  public Category1 category1;
  public Category2 category2;
  public Category3 category3;
...
}

public enum Category1{
...
}

public enum Category2{
...
}

public enum Category3{
...
}

In the JSON the first entry of the categories-Array is always a value of the enum Category1, the second entry is always a value of the enum Category2 and the third entry is always a value of the enum Category3.

How can I deserialize this JSON into my class structure using Jackson?

1
  • I hope it was only a typo, otherwise it won't be a valid JSON: A , is missing after "id":1. Commented Feb 15, 2016 at 9:45

1 Answer 1

2

You can create your custom deserializer by extending the JsonDeserializer<T> class.

Here is a sample implementation to fit your needs

public class MyClassDeserializer extends JsonDeserializer<MyClass>{

    @Override
    public MyClass deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        int id = (Integer) ((IntNode) node.get("id")).numberValue();

        JsonNode categories = node.get("categories");
        Iterator<JsonNode> iter = categories.elements();

        while(iter.hasNext()){
            //create Category object based on an incrementing counter
        }

        MyClass myClass = //compose myClass from the values deserialized above.

        return myClass;
    }

}

To use it, you just have to annotate MyClass with @JsonDeserialize pointing to your custom deserializer.

@JsonDeserialize(using = MyClassDeserializer.class)
public class MyClass {

    private Integer id;
    private Category1 category1;
    private Category2 category2;
    private Category3 category3;

}

Not related, but as a good practice, make all your fields private then expose public setters and getters in order to control the fields of the class.

Sign up to request clarification or add additional context in comments.

1 Comment

I actually strictly use private fields (and final where possible). I just thought it would blow up the question unneccessarily.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.