9

使用 Jackson 2 将数组反序列化为字符串的问题

这与使用 Jackson 将 String 中的 ArrayList 反序列化类似的问题

传入的 JSON(我无法控制)有一个元素“thelist”,它是一个数组。但是,有时这会以空字符串而不是数组的形式出现:

例如。而不是"thelist" : [ ]
它以"thelist" : ""的形式出现

我无法解析这两种情况。

工作正常的“sample.json”文件:

{
   "name" : "widget",
   "thelist" : 
    [
       {"height":"ht1","width":"wd1"}, 
       {"height":"ht2","width":"wd2"}
    ]
}

课程:

public class Product { 
    private String name; 
    private List<Things> thelist; 
    // with normal getters and setters not shown
}

public class Things {
        String height;
        String width;
        // with normal getters and setters not shown
}

工作正常的代码:

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test2 {
 public static void main(String[] args) 
    {
        ObjectMapper mapper = new ObjectMapper(); 
        Product product = mapper.readValue( new File("sample.json"), Product.class);
    }
}

但是,当 JSON 有一个空字符串而不是一个数组时,即。“thelist”:“”
我得到这个错误:

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [collection type; class java.util.ArrayList, contains [simple type, class com.test.Things]] from JSON String; no single-String constructor/factory method (through reference chain: com.test.Product["thelist"])

如果我添加这一行(这适用于 Ryan 在Deserialize ArrayList from String using Jackson并且似乎受到文档的支持),

mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

没什么区别。

还有其他设置,还是我需要编写自定义反序列化器?
如果是后者,是否有使用 Jackson 2.0.4 执行此操作的简单示例?
我是杰克逊的新手(也是第一次发帖,所以要温柔)。我做了很多搜索,但找不到一个好的工作示例。

4

2 回答 2

4

问题是虽然单元素到数组有效,但您仍在尝试从(空)字符串转换为对象。我假设这是您面临的问题,尽管很难说无一例外。

但也有DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT可能与第一个功能相结合的技巧。如果是这样,您将获得一个List带有单个“空对象”的 a,这意味着Things没有值的实例。

现在理想情况下应该发生的是,如果你只启用ACCEPT_EMPTY_STRING_AS_NULL_OBJECT了,那可能会做你想做的事:thelist属性的空值。

于 2012-10-08T20:47:02.833 回答
1

嗨,当我得到这样的对象时,我正在解决类似的问题

{  
   "name" : "objectname",
   "param" : {"height":"ht1","width":"wd1"}, 
}

来自外部系统,所以“参数”对我来说是我试图反序列化的对象。当此对象在外部系统中定义时,它可以正常工作。但是当外部系统中的对象“参数”未定义时,我得到空数组而不是空对象

{  
   "name" : "objectname",
   "param" : [], 
}

这会导致映射异常。我通过创建自定义 json 反序列化器来解决它,这里有很好的例子,对于测试类型,我使用了类似的东西

    ObjectCodec oc = jsonParser.getCodec();
    JsonNode node = oc.readTree(jsonParser);
    if (JsonNodeType.OBJECT == node.getNodeType()) {
        ParamObject result = new ParamObject();
        result.setHeight(node.get("height").asText());
        result.setWidth(node.get("width").asText());
        return result;
    }
    // object in MailChimp is not defined
    return null;
于 2014-07-11T15:37:04.473 回答