我有一个具有以下变量的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响应的情况下,但是如果响应仅包含某些数据,它也将起作用。
答案 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;