这是我的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
中,完成后,您可以使用ObjectMapper
的convertValue
api将此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