Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java和json属性-运行时的不同类型_Java_Json_Jackson - Fatal编程技术网

java和json属性-运行时的不同类型

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

我调用一个外部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:无法从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);