如何使用Jackson对动态字段进行反序列化?

时间:2013-12-01 07:27:50

标签: java json jackson

我有以下Json:

{
    "id": "id1",
    "version": "id1",
    "license": { "type": "MIT" }
}

其中也可以采用以下形式:

{
    "id": "id1",
    "version": "id1",
    "license": "MIT"
}

有时它可能是:

{
    "id": "id1",
    "version": "id1",
    "licenses": [
    { "type": "MIT", "url: "path/to/mit" },
    { "type": "Apache2", "url: "path/to/apache" }]
}

以上所有内容基本相同,我正在寻找一种方法将它们与单个字段组合并使用Jackson对其进行反序列化。任何想法?

1 个答案:

答案 0 :(得分:2)

首先,请看这个问题:Jackson deserialization of type with different objects。您可以将JSON反序列化为低于POJO类:

class Entity {

    private String id;
    private String version;
    private JsonNode license;

    public String getId() {
        return id;
    }

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

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public JsonNode getLicense() {
        return license;
    }

    public void setLicense(JsonNode license) {
        this.license = license;
    }

    public void setLicenses(JsonNode license) {
        this.license = license;
    }

    public String retrieveLicense() {
        if (license.isArray()) {
            return license.elements().next().path("type").asText();
        } else if (license.isObject()) {
            return license.path("type").asText();
        } else {
            return license.asText();
        }
    }

    @Override
    public String toString() {
        return "Entity [id=" + id + ", version=" + version + ", license=" + license + "]";
    }
}

如果要从POJO类中检索许可证名称,请使用retrieveLicense方法。当然,您可以改进此方法的实现。我的示例仅显示了如何实现它的方式。如果要将POJO类与反序列化逻辑分离,可以编写自定义反序列化器。