简体   繁体   中英

Jackson: Deserialize JSON-Array in different attributes of an object

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?

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM