使用list反序列化JSON包装器对象将返回null属性

时间:2014-06-11 15:38:59

标签: java json jackson

我得到了如下的json:

{"examinationTypes":[{"ExaminationTypeVO":{"id":1,"name":"Badanie krwi"}},{"ExaminationTypeVO":{"id":2,"name":"Spirometria"}},{"ExaminationTypeVO":{"id":3,"name":"Wymaz"}},{"ExaminationTypeVO":{"id":4,"name":"Ciśnienie"}},{"ExaminationTypeVO":{"id":5,"name":"EKG"}},{"ExaminationTypeVO":{"id":6,"name":"Elektrowstrząsy"}},{"ExaminationTypeVO":{"id":7,"name":"Tomografia"}},{"ExaminationTypeVO":{"id":8,"name":"Lewatywa"}},{"ExaminationTypeVO":{"id":9,"name":"Aneskopia"}},{"ExaminationTypeVO":{"id":10,"name":"Rektoskopia"}},{"ExaminationTypeVO":{"id":11,"name":"Kolonoskopioa"}},{"ExaminationTypeVO":{"id":12,"name":"Echo serca"}},{"ExaminationTypeVO":{"id":13,"name":"Ablacja"}},{"ExaminationTypeVO":{"id":14,"name":"Badnaie dopplerowskie"}},{"ExaminationTypeVO":{"id":15,"name":"Kapilaroskopia"}}]}

我已经定义了类型:

@JsonRootName(value="ExaminationTypeVO")
@JsonIgnoreProperties(ignoreUnknown = true)
public class ExaminationTypeVO {


private Long id;

private String name;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

public class ExaminationTypesVO {

private List<ExaminationTypeVO> examinationTypes;

public List<ExaminationTypeVO> getExaminationTypes() {
    return examinationTypes;
}

public void setExaminationTypes(List<ExaminationTypeVO> examinationTypes) {
    this.examinationTypes = examinationTypes;
}

当我像这样反序列化时:

ExaminationTypesVO l = m.readValue(result, ExaminationTypesVO.class);

我收到一个包装器对象,但里面的列表包含了ExaminationTypeVO类型的对象,所有属性都设置为null。

任何人都可以帮忙搞清楚吗?

1 个答案:

答案 0 :(得分:2)

您的问题是您有一个额外级别的对象,您尝试反序列化。在我解释这一点时,试着不要混淆:你有一个对象数组,这些对象包含一个ExaminationTypeVO对象。

如果你坚持使用你提供的JSON结构,那么你需要添加另一个&#34;等级&#34;你的反序列化。您可以通过ExaminationTypesVO类中的包装器对象执行此操作:

public class ExaminationTypesVO {
    private List<ExaminationTypeVOWrapper> examinationTypes;

    public List<ExaminationTypeVOWrapper> getExaminationTypes() {
        return examinationTypes;
    }

    public void setExaminationTypes(List<ExaminationTypeVOWrapper> examinationTypes) {
        this.examinationTypes = examinationTypes;
    }

    public static class ExaminationTypeVOWrapper {
        private final ExaminationTypeVO examinationTypeVO;

        @JsonCreator
        public ExaminationTypeVOWrapper(@JsonProperty("ExaminationTypeVO") ExaminationTypeVO examinationTypeVO) {
            this.examinationTypeVO = examinationTypeVO;
        }

        public ExaminationTypeVO getExaminationTypeVO() {
            return examinationTypeVO;
        }
    }
}

如果您可以控制要反序列化的JSON,则可以删除额外的&#34;级别&#34; (ExaminationTypeVO包装对象)而不必更改代码。这种方法中的新JSON看起来像是:

{
    "examinationTypes": [
        {
            "id": 1,
            "name": "Badanie krwi"
        }, ...
    ]
}

使用这两种方法中的任何一种,您都可以删除ExaminationTypeVO上的两个类级别注释。