映射复杂映射类型API对Java POJO的响应



这是我的API响应,这里的响应是Map对象而不是Json。

{
"staticResponses": [
{
"code": {
"id": "someId",
"value": "44343567"
},
"staticAttributes": [
{
"id": "SEC_GUAR",
"value": "someValue4"
},
{
"id": "FIN_BOND_TYPE",
"value": ""
},
{
"id": "SEC_ISSER_ID",
"value": "someValue5"
},
{
"id": "SEC_ISSE_CRNCY",
"value": "someValue6"
}
//Here more objects with id and value(same as above) which needs to be mapped to corresponding fields of RatingModel Pojo.   
]
}
]
}

API对等效Pojo字段映射的响应

Keys Comming In API Response        Corresponding Field Name in Model            
SEC_GUAR                            guarantor
FIN_BOND_TYPE                       covered
SEC_ISSER_ID                        issuerId
SEC_ISSE_CRNCY                      securityCurrency

我的Pojo,我需要映射到数据

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RatingCompositionModel implements CompositionModel {
private List<RatingModel> ratings;
}

评级模型.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RatingModel implements CompositionModel, Serializable {
private static final long serialVersionUID = -8447345872052120852L;
private String securityCurrency;
private String covered;
private String guarantor;
private String issuerId;
//here renaming fields 
}

我为实现相同而编写的代码

private CompositionModel mapResponseToObject(LinkedHashMap responseBody) {
RatingCompositionModel ratingCompositionModel = new RatingCompositionModel();
List<RatingModel> ratingModelList = new ArrayList<>();
List<LinkedHashMap> responseObjectList = (List<LinkedHashMap>) responseBody.get("staticResponses");
if( null != responseObjectList && !responseObjectList.isEmpty() ) {
responseObjectList.forEach(responseObject -> {
List<LinkedHashMap> staticAttributes = (List<LinkedHashMap>)responseObject.get("staticAttributes");
if( null != staticAttributes && !staticAttributes.isEmpty()) {
RatingModel ratingModel = new RatingModel();
staticAttributes.forEach(staticAttribute -> {
if( ((String)staticAttribute.get("id")).equals("SEC_GUAR") ) {
ratingModel.setSecurityCurrency((String)staticAttribute.get("value"));
}
// more else if here...
});
ratingModelList.add(ratingModel);
}
});
}
ratingCompositionModel.setRatings(ratingModelList);
return ratingCompositionModel;
}

所以这里的问题是我必须使用的if-else块的数量,目前我有大约50个字段需要从API响应中提取,并且需要映射到我的POJO中的相应字段,所以在我的方法中,如果我的POJO中有任何变化,比如添加了更多的字段(这是很有可能的(,我必须添加更多的if-else块。这里还值得注意的是,我无法更改API响应中字段的名称以使其与我的POJO相匹配,因为这是一些不在我控制范围内的第三方API。

这里寻找更动态的解决方案,以避免if-else阻塞,并有效地处理任何未来的更改。

您不需要设置if-else条件,只需遍历staticAttributes并将其存储在Map中,完成后,您可以使用ObjectMapperconvertValueapi将此Map对象直接映射到POJO类。

FinalPojo readValue = objectMapper.convertValue(collect, FinalPojo.class);

但您需要告诉Jackson,映射中的哪个键要映射到POJO中的哪个字段。您可以使用@JsonProperty注释。

以下是POJO类的样本

import com.fasterxml.jackson.annotation.JsonProperty;
public class FinalPojo {
@JsonProperty("SEC_GUAR")
private String guarantor;
@JsonProperty("FIN_BOND_TYPE")
private String covered;
@JsonProperty("SEC_ISSER_ID")
private String issuerId;
@JsonProperty("SEC_ISSE_CRNCY")
private String securityCurrency;
}

您可以简单地使用Gson库提供的@SerializedName注释来注释类的字段。你可以在下面找到一个例子。使用这个库转换json真的很方便。

https://www.tutorialspoint.com/what-to-use-serializedname-annotation-using-gson-in-java

最新更新