使用Jackson解析JSON:POJO中是否可以包含可选变量

时间:2018-08-01 14:02:13

标签: java json jackson

我有一个具有以下变量的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;

哪个用于解析有关许可证文件的详细信息? 当我们调用某些其余端点时,我们得到以下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 个答案:

答案 0 :(得分:2)

Jackson具有各种功能,例如可以关闭FAIL_ON_UNKNOWN_PROPERTIES以允许POJO中不存在的JSON中的未知属性:

new ObjectMapper()
    .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)

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

答案 1 :(得分:2)

我可以考虑两种方法,它们并不互斥。

  

是否可以通过注释将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。

如果您知道属性名称的可能变化,则可以使用在杰克逊2.9版中引入的@JsonAlias

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