代码之家  ›  专栏  ›  技术社区  ›  DevRight

使用Jackson解析JSON:POJO中可以有可选变量吗

  •  2
  • DevRight  · 技术社区  · 6 年前

    我有一个带有以下变量的POJO。

    private Long poId;
    private String nodeName;
    private String fingerPrint;
    private String hardwareResourceName;
    private String sequenceNumber;
    private String importedOn;
    private String importedBy;
    private String generated;
    private String installedOn;
    private String currentLicense;
    private String productType;
    

    哪个用于分析有关许可证文件的详细信息? 当我们调用某些rest端点时,会得到以下JSON响应。

    [{"nodeName":"LTE02ERBS00042","fingerprint":"LTE02ERBS00042_fp","hardwareResourceName":"ELSN","generatedOn":"1251359414000","installedOn":"","currentLicense":"false","sequenceNumber":9000,"importedOn":"1531929161227","poId":281475302769484,"filePath":"/home/smrs/smrsroot/licence/LTE02ERBS00042_fp/LTE02ERBS00042_fp_151008_060941.xml","importBy":"agatAdm7160","neType":"ERBS","platformType":"CPP"}
    

    从JSON可以看到,与POJO响应中返回的内容不匹配,例如: from pojo: fingerPrint from JSON: fingerprint . 此外,JSON还有POJO中没有的额外字段。POJO在其他区域中使用,所以我不想改变现有的功能。我想添加额外的字段来适应返回数据中的更改,而不必创建单独的POJO。

    有没有一种方法可以通过注释将POJO中的变量设置为可选的或不总是需要的?所以在我们得到一个包含所有变量的JSON响应的情况下非常好,但是如果响应只有特定的数据,那么它也会工作。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Karol Dowbecki    6 年前

    杰克逊在处理这个问题上有很多特点。 FAIL_ON_UNKNOWN_PROPERTIES 可以关闭以允许在波霍中不存在的JSON中的未知属性:

    new ObjectMapper()
        .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
    

    看一看 Jackson wiki 其中列出了可用的功能:

        2
  •  2
  •   cassiomolin    6 年前

    我能想到两种方法,它们并不相互排斥。

    有没有一种方法可以通过注释将POJO中的变量设置为可选的或不总是需要的?

    您可以将未映射的属性存储在 Map<String, Object> :

    private Map<String, Object> otherProperties = new HashMap<String, Object>();
    

    然后使用带注释的方法 @JsonAnySetter :

    @JsonAnySetter
    public void setOtherProperty(String key, Object value) {
        otherProperties.put(key, value);
    }
    

    如果需要对此类属性执行序列化,请使用注释为 @JsonAnyGetter :

    @JsonAnyGetter
    public Map<String, String> getOtherProperties() {
        return otherProperties;
    }
    

    我想添加额外的字段来适应返回数据中的更改,而不必创建单独的POJO。

    如果您知道属性名称的可能变化,可以使用 @JsonAlias ,这是在Jackson 2.9中介绍的:

    @JsonAlias({ "fingerprint", "fingerPrint" })
    private String fingerprint;