java和json属性在运行时具有不同的类型
我调用一个外部web服务来获取一个json对象。这个对象有一个属性“value”,它有时是字符串,有时是字符串数组
public class MyClass {
// ... other variables
private String value;
public String getValue() {
return value;
}
@JsonProperty("value")
public void setValue(String value) {
this.value = value;
}
}
目前,我收到一个错误org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
抱怨这个字段。我想知道是否有人能给我一个提示,在我的类中定义value
的正确方法是什么
这是我必须处理的示例json的一部分:
{
"id": 12016907001,
"type": "Create",
"value": "normal",
"field_name": "priority"
},
{
"id": 12016907011,
"type": "Create",
"value": [
"sample",
"another"
],
"field_name": "tags"
}
谢谢
--编辑
我将值的类型更改为Object,它解决了我的问题。然而,我仍然想知道是否有更好的方法来处理这个案件
# 1 楼答案
一个简单的方法是启用DeserializationFeature#ACCEPT_SINGLE_VALUE_AS_ARRAY,然后使用Daniel的答案。如果web服务返回一个字符串,Jackson将把它转换为一个元素集合
编辑:
如果您无法升级到Jackson 1.8或更高版本以使用此功能,您可以执行以下操作:
# 2 楼答案
您可以使用JsonNode作为值的类型。之后,您可以根据
isArray()
(或isValueNode()
)的返回值处理您的值。我认为JsonNodes是处理原始JSON最方便的方法,因为它们提供了超越这些简单检查的广泛功能# 3 楼答案
值是数组,因此无法将其转换为字符串
您的java类应该如下所示:
例如,我使用公共字段(这将很好地工作)