【问题标题】:How to deserialize dynamic field using Jackson?如何使用杰克逊反序列化动态字段?
【发布时间】:2013-12-01 07:27:49
【问题描述】:

我有以下 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 反序列化的方法。有什么想法吗?

【问题讨论】:

  • 抱歉,我已经编辑了问题,应该是 "license":"MIT"

标签: java json jackson


【解决方案1】:

一开始,请看这个问题: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 类与反序列化逻辑解耦,您可以编写自定义反序列化器。

【讨论】:

  • 谢谢,在去自定义反序列化器之前我会使用这个方法。
  • 另外:请注意,“license”和“licenses”可以有单独的设置器,即使它们在逻辑上引用相同的属性。然后他们会采取不同的论点;如果你愿意,你仍然可以在内部只使用一个字段。只要你有 getter 和 setter,内部字段对 Jackson 没有兴趣(被忽略)。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 2013-07-10
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多