java和json属性-运行时的不同类型
我调用一个外部web服务来获取一个json对象。这个对象有一个属性“value”,它有时是字符串,有时是字符串数组java和json属性-运行时的不同类型,java,json,jackson,Java,Json,Jackson,我调用一个外部web服务来获取一个json对象。这个对象有一个属性“value”,它有时是字符串,有时是字符串数组 public class MyClass { // ... other variables private String value; public String getValue() { return value; } @JsonProperty("value") public void setValue(S
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:无法从START\u数组令牌中反序列化java.lang.String实例
抱怨此字段。我想知道是否有人能给我一个提示,在我的课堂上定义值的正确方法是什么
这是我必须处理的示例json的一部分:
{
"id": 12016907001,
"type": "Create",
"value": "normal",
"field_name": "priority"
},
{
"id": 12016907011,
"type": "Create",
"value": [
"sample",
"another"
],
"field_name": "tags"
}
谢谢
--编辑
我将值的类型更改为Object,它解决了我的问题。但是,我仍然想知道是否有更好的方法来处理这种情况。值是一个数组,因此不能转换为字符串
您的java类应该如下所示:
class MyClass
{
public int id;
public String type;
public Collection<String> value;
public String field_name;
}
class-MyClass
{
公共int id;
公共字符串类型;
公共收藏价值;
公共字符串字段名称;
}
例如,我使用公共字段(这很好)。您可以将其用作值的类型。之后,您可以根据isArray()
(或isValueNode()
)的返回值处理您的值。我认为JsonNodes是处理原始JSON最方便的方法,因为它们提供了超越这些简单检查的广泛功能
if (value.isArray()) {
// process your array
} else {
// process your string
}
一个简单的方法是启用并使用Daniel的答案。如果web服务返回一个字符串,Jackson将把它转换为一个元素集合
编辑:
如果您无法升级到Jackson 1.8或更高版本以使用此功能,您可以执行以下操作:
private Collection<String> value;
public Collection<String> getValue() {
return value;
}
public void setValue(Object value) {
if (value instanceof Collection) {
this.value = (Collection<String>) value;
} else {
this.value = Arrays.asList((String) value);
}
}
私人收藏价值;
公共集合getValue(){
返回值;
}
公共无效设置值(对象值){
if(集合的值实例){
this.value=(集合)值;
}否则{
this.value=Arrays.asList((字符串)值);
}
}
您是否可以控制外部web服务?这并不能回答OP的问题。外部服务对值
字段的定义不一致。有时它是一个数组,有时它只是一个字符串。这个解决方案看起来很有趣,但我使用的是org.codehaus.jackson.map.DeserializationConfig
而不是com.fasterxml.jackson.databind.DeserializationFeature
,它没有这个配置!嗯,将“值”的类型更改为Object解决了我的问题。然而,我认为你的解决方案看起来是最好的解决方案,因此我接受它作为答案。谢谢此选项似乎在Jackson 1.8.0+中,因此如果您可以访问该版本或更高版本,您可以使用它。非常感谢HiJon89,我将该版本更改为当前版本(1.9.12),现在我可以毫无问题地拥有列表值
,感谢您的帮助!对于Jackson 2.2,需要使用objectMapper.configure(反序列化功能.ACCEPT_SINGLE_VALUE_AS_ARRAY,true);