杰克逊默认使用自定义JSON反序列化器

时间:2014-09-24 10:48:32

标签: java json jackson deserialization json-deserialization

以下所有代码均为简化版。 我有JSON结构:

{
    "content" : {
        "elements" : [ {
            "type" : "simple"
            },
            {
            "type" : "complex", 
            "content" : {
                "elements" : [ {
                    "type" : "simple"
                },
                {
                    "type" : "simple"
                },
                {
                    "type" : "complex",
                    "content" : {
                      ---- /// ----
                    }
                } ] 
            } 
        } ] 
    }
}

我使用Jackson lib进行反序列化,我正在尝试实现一种" mix"使用默认反序列化器自定义。 我希望Element对象使用自定义ElementDeserializer创建,但对于Content字段内部使用默认值。不幸的是这样的事情:

@JsonDeserialize(using = StdDeserializer.class)
@JsonProperty
Content content;  

不工作=(

现在是我的代码:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Content {

    @JsonProperty("elements")
    ArrayList<Element> mElements;

}

@JsonDeserialize(using = ElementDeserializer.class)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Element<T extends ElementType> {

    @JsonProperty
    Content content;

    T mField;

    public Element(T field) {
        mField = field;
    }

}

public class ElementDeserializer extends JsonDeserializer<Element> {

    @Override
    public Element deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        Element element = null;
        JsonNode node = jp.getCodec().readTree(jp);
        if ("simple".equals(node.get("type").textValue())) {
            element = new Element(new SimpleField());
        } else if ("complex".equals(node.get("type").textValue())) {
            element = new Element(new ComplexField());
        }
        return element;
    }
}

我将不胜感激!

1 个答案:

答案 0 :(得分:1)

不确定是否强制要求您使用自定义反序列化程序(原因未在帖子中注明)。如果不是,那么您可以使用默认的反序列化器。

以下是:

@JsonIgnoreProperties(ignoreUnknown = true)
public class TopObject {
    @JsonProperty
    public Content content;

    public TopObject() {
    }
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Content {

    @JsonProperty
    public Element elements [];

    public Content() {
    }
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ 
    @Type(value = SimpleElement.class, name = "simple"),
    @Type(value = ComplexElement.class, name = "complex")
})
public class Element {     
    public Element() {
    }
}

public class SimpleElement extends Element {
    public SimpleElement() {
    }
}

public class ComplexElement extends Element {    
    @JsonProperty
    public Content content;

    public ComplexElement() {
    }
}

然后将json数据反序列化为TopObject.class