有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,它解决了我的问题。然而,我仍然想知道是否有更好的方法来处理这个案件


共 (3) 个答案

  1. # 1 楼答案

    一个简单的方法是启用DeserializationFeature#ACCEPT_SINGLE_VALUE_AS_ARRAY,然后使用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);
        }
    }
    
  2. # 2 楼答案

    您可以使用JsonNode作为值的类型。之后,您可以根据isArray()(或isValueNode())的返回值处理您的值。我认为JsonNodes是处理原始JSON最方便的方法,因为它们提供了超越这些简单检查的广泛功能

    if (value.isArray()) {
    
        // process your array
    
    } else {
    
        // process your string
    
    }
    
  3. # 3 楼答案

    值是数组,因此无法将其转换为字符串

    您的java类应该如下所示:

    class MyClass
    {
       public int id;
       public String type;
       public Collection<String> value;
       public String field_name;
    }
    

    例如,我使用公共字段(这将很好地工作)