我需要解码以下JSON-Structure:
{
"id":1
"categories": [
value_of_category1,
value_of_category2,
value_of_category3
]
}
我想要反序列化的对象是以下类:
class MyClass {
public Integer id;
public Category1 category1;
public Category2 category2;
public Category3 category3;
...
}
public enum Category1{
...
}
public enum Category2{
...
}
public enum Category3{
...
}
在JSON中,categories-Array的第一个条目始终是枚举Category1的值,第二个条目始终是枚举Category2的值,第三个条目始终是枚举Category3的值。
如何使用Jackson将此JSON反序列化为我的类结构?
答案 0 :(得分:2)
您可以通过扩展JsonDeserializer<T>
类来创建自定义反序列化程序。
以下是满足您需求的示例实现
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;
}
}
要使用它,您只需注释MyClass
,@JsonDeserialize
指向您的自定义反序列化器。
@JsonDeserialize(using = MyClassDeserializer.class)
public class MyClass {
private Integer id;
private Category1 category1;
private Category2 category2;
private Category3 category3;
}
不相关,但作为一种良好做法,将所有字段设为私有,然后公开公共setter和getter以控制类的字段。