Jackson Json 到 POJO 的映射
Jackson Json to POJO mapping
我在用杰克逊创建映射时有点迷茫。我的 Json 具有以下结构
{
"d": {
"__metadata": {
"uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/JobApplication(1463L)",
"type": "SFOData.JobApplication"
},
"lastName": "K",
"address": "123 Main Street",
"cellPhone": "12345",
"firstName": "Katrin",
"city": "Anytown",
"country": "United States",
"custappattachment": {
"results": [
{
"__metadata": {
"uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/Attachment(1188L)",
"type": "SFOData.Attachment"
},
"fileExtension": "jpeg",
"fileName": "hp-hero-img.jpeg",
"fileContent": "/9j/4AA"
},
{
"__metadata": {
"uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/Attachment(1189L)",
"type": "SFOData.Attachment"
},
"fileExtension": "jpeg",
"fileName": "hp-content-bkgd-img.jpeg",
"fileContent": "/9j/4AAQSk"
}]}}}
我确实找到了很多处理数组的教程,但我已经用第一个标记 "d" 失败了。
并且根本不需要所有“__metadata”标记。
我创建了一个包含 lastName 等属性和集合附件的 pojo。
但是我的代码总是在令牌 "d" 或“__metadata”
处失败
public class ResponseDataObject {
private String lastName;
private String address;
private String cellPhone;
private String firstName;
private String city;
private String country;
private List<Attachment> attachments = new ArrayList<>();
.....getters and setters
和杰克逊 reader
ObjectReader objectReader =
mapper.readerFor(ResponseDataObject.class);
ResponseDataObject dataObject = objectReader.readValue(file);
如有任何提示,我们将不胜感激。
问候
马蒂亚斯
您需要忽略 POJO 中不存在的属性。在 DeserializationFeature
中为 ObjectMapper
设置以下 属性:
// for version 1.x
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// for newer versions
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
反序列化代码:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
ResponseDataObject dataObject = mapper.readValue(file, ResponseDataObject.class);
并将此注释添加到 ResponseDataObject class:
@JsonRootName(value = "d")
class ResponseDataObject {
您可以使用 @JsonIgnoreProperties
注释来忽略与 class 中定义的任何成员不匹配的属性,例如:
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResponseDataObject {
这将确保映射所有匹配属性并忽略其他属性。
我在用杰克逊创建映射时有点迷茫。我的 Json 具有以下结构
{
"d": {
"__metadata": {
"uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/JobApplication(1463L)",
"type": "SFOData.JobApplication"
},
"lastName": "K",
"address": "123 Main Street",
"cellPhone": "12345",
"firstName": "Katrin",
"city": "Anytown",
"country": "United States",
"custappattachment": {
"results": [
{
"__metadata": {
"uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/Attachment(1188L)",
"type": "SFOData.Attachment"
},
"fileExtension": "jpeg",
"fileName": "hp-hero-img.jpeg",
"fileContent": "/9j/4AA"
},
{
"__metadata": {
"uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/Attachment(1189L)",
"type": "SFOData.Attachment"
},
"fileExtension": "jpeg",
"fileName": "hp-content-bkgd-img.jpeg",
"fileContent": "/9j/4AAQSk"
}]}}}
我确实找到了很多处理数组的教程,但我已经用第一个标记 "d" 失败了。 并且根本不需要所有“__metadata”标记。
我创建了一个包含 lastName 等属性和集合附件的 pojo。 但是我的代码总是在令牌 "d" 或“__metadata”
处失败public class ResponseDataObject {
private String lastName;
private String address;
private String cellPhone;
private String firstName;
private String city;
private String country;
private List<Attachment> attachments = new ArrayList<>();
.....getters and setters
和杰克逊 reader
ObjectReader objectReader =
mapper.readerFor(ResponseDataObject.class);
ResponseDataObject dataObject = objectReader.readValue(file);
如有任何提示,我们将不胜感激。
问候 马蒂亚斯
您需要忽略 POJO 中不存在的属性。在 DeserializationFeature
中为 ObjectMapper
设置以下 属性:
// for version 1.x
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// for newer versions
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
反序列化代码:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
ResponseDataObject dataObject = mapper.readValue(file, ResponseDataObject.class);
并将此注释添加到 ResponseDataObject class:
@JsonRootName(value = "d")
class ResponseDataObject {
您可以使用 @JsonIgnoreProperties
注释来忽略与 class 中定义的任何成员不匹配的属性,例如:
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResponseDataObject {
这将确保映射所有匹配属性并忽略其他属性。