我有一个这样的场景,需要使用Object mapper转换为对象。因此,我创建了一个如下所示的属性来捕获OrderDispatchItemDTO。
@JsonProperty("OrderDispatchItemDTO")
private OrderDispatchItemDTO orderDispatchItemsDTO;
{
"Message": {
"MessageData": {
"OrderDispatchDTO": {
"StartDateTime": "2017-05-19T02:45:00",
"Details": {
"OrderDispatchItemDTO": {
more json properties
}
},
"EndDateTime": "2017-05-19T05:45:00",
}
},
"StatusID": 1,
}
}
但是如果OrderDispatchItemDTO作为列表出现,那么我的映射器将失败,因为它无法解析json字符串
@JsonProperty("OrderDispatchItemDTO")
private List<OrderDispatchItemDTO> orderDispatchItemsDTO;
{
"Message": {
"MessageData": {
"OrderDispatchDTO": {
"StartDateTime": "2017-05-19T02:45:00",
"Details": [
"OrderDispatchItemDTO": {
more json properties
},
"OrderDispatchItemDTO": {
more json properties
}
],
"EndDateTime": "2017-05-19T05:45:00",
}
},
"StatusID": 1,
}
}
修复程序是mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,true);
答案 0 :(得分:0)
您可以使用@JsonAnySetter属性并动态设置列表。这是一个例子。就我而言,一个属性可以是数字或对象,所以这是我简单地解决它的方法:
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
try {
if (name.equals("property") && value != null) {
MyObject t = null;
if (value instanceof Long) {
t = new MyObject();
t.setId((Long) value);
} else if (value instanceof LinkedHashMap) {
t = mapper.convertValue(value, MyObject.class);
}
//putting t anywhere i.e. setting property
}
}
catch (Exception e) {
e.printStackTrace();
}
}