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



我有一个带有以下变量的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: fingerPrintfrom JSON: fingerprint。此外,JSON还有额外的字段,这些字段不在POJO中。POJO用于其他领域,所以我不想更改现有的功能。我想添加额外的字段来适应返回数据的变化,而不必创建单独的POJO。

有没有一种方法可以通过注释将POJO中的变量设置为可选的或不总是需要的?因此,在我们得到一个包含所有变量的JSON响应的情况下,这很好,但如果响应只有某些数据,它也会起作用。

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

有没有一种方法可以通过注释将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;

Jackson有各种功能来处理这一问题,例如FAIL_ON_UNKNOWN_PROPERTIES可以关闭,以允许JSON中存在POJO:中不存在的未知属性

new ObjectMapper()
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)

看看Jackson wiki,它列出了可用的功能:

  • 映射器功能
  • 反序列化功能
  • 序列化功能

最新更新