Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
Json 使用Jackson ACCEPT_SINGLE_VALUE_AS_数组从字符串反序列化ArrayList_Json_Serialization_Jackson - Fatal编程技术网

Json 使用Jackson ACCEPT_SINGLE_VALUE_AS_数组从字符串反序列化ArrayList

Json 使用Jackson ACCEPT_SINGLE_VALUE_AS_数组从字符串反序列化ArrayList,json,serialization,jackson,Json,Serialization,Jackson,使用Jackson 2将数组反序列化为字符串时出现问题 这是一个类似的问题 传入的JSON(我无法控制)有一个元素“thelist”,它是一个数组。 但是,有时这是一个空字符串,而不是数组: 代替“列表”:[] 它以“列表”的形式出现:“ 我在分析这两种情况时都遇到困难 工作正常的'sample.json'文件: { "name" : "widget", "thelist" : [ {"height":"ht1","width":"wd1"},

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

这是一个类似的问题

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

代替“列表”:[]
它以“列表”的形式出现:“

我在分析这两种情况时都遇到困难

工作正常的'sample.json'文件:

{
   "name" : "widget",
   "thelist" : 
    [
       {"height":"ht1","width":"wd1"}, 
       {"height":"ht2","width":"wd2"}
    ]
}
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);
    }
}
课程包括:

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
}
但是,当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工作,并且似乎得到文档的支持)

这没什么区别

是否有其他设置,或者是否需要编写自定义反序列化程序?
如果是后者,有没有一个简单的例子可以用Jackson 2.0.4做到这一点?

我是杰克逊的新人(也是第一次登海报,所以要温柔)。我已经做了很多搜索,但找不到一个好的工作示例。

问题是,尽管单个元素到数组可以工作,但您仍在尝试将(空)字符串转换为对象。我假设这就是你面临的问题,尽管毫无例外这很难说

但也有反序列化功能。将\u EMPTY\u STRING\u接受为\u NULL\u OBJECT,这可能会与第一个功能结合使用。如果是这样,您将得到一个带有单个“空对象”的
列表,意思是
没有值的东西
实例


现在理想的情况是,如果您只启用了
接受空字符串作为空字符串对象
,这可能会满足您的需要:列表属性的空值。

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

{  
   "name" : "objectname",
   "param" : {"height":"ht1","width":"wd1"}, 
}
从外部系统,所以“param”是我试图反序列化的对象。在外部系统中定义此对象时,它可以正常工作。但当外部系统中的对象“param”未定义时,我得到的是空数组,而不是空对象

{  
   "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;

谢谢,但这两个建议仍然给出了与以前相同的异常,即:com.fasterxml.jackson.databind.JsonMappingException:无法从JSON字符串实例化类型[collection type;class java.util.ArrayList,包含[simple type,class com.test.Things]]的值;没有单个字符串构造函数/工厂方法(通过引用链:com.test.Product[“thelist”]),所以我想我需要编写一个自定义反序列化程序?你能给我举一个用Jackson 2.0.4实现这一点的简单工作示例吗?这实际上是一件非常重要的事情(不是不可能的,只是需要更多的工作)。但我认为可能有一种更简单的方法:您可以重写
setThelist
方法,使其采用
java.lang.Object
(或
JsonNode
),然后分别处理案例。对于空字符串,您得到“”,对于非空字符串,
java.util.List
(或者
ArrayNode
,如果使用JSON树)。对于实际绑定的内容,需要使用
ObjectMapper.convertValue
。但除非这是一种常见的情况,否则它可能比自定义集合反序列化器的工作量要少。现在,如果您确实想/需要编写自定义集合反序列化器,可以通过实现
反序列化器来完成,该反序列化器将覆盖构造反序列化器所调用的方法,请使用
模块注册它(简单的模块不适用于集合处理程序)。您可以在
com.fasterxml.jackson.databind.desr.std
下查看标准实现--有一些特殊情况支持类型信息等。请查看[,接受_EMPTY_STRING_,因为_NULL_对象也适用于数组、集合和映射。它也适用于上面显示的数据和类,无论是否使用其他设置。我使用的是2.1.0-SNAPSHOT,但在这方面它不应与2.0.4有所不同。
    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;