我有一个带有以下变量的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响应的情况下,这很好,但如果响应只有某些数据,它也会起作用。
我可以考虑两种方法,它们并不互斥。
有没有一种方法可以通过注释将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,它列出了可用的功能:
- 映射器功能
- 反序列化功能
- 序列化功能