无法反序列化并序列化Java List<>与杰克逊

时间:2015-07-14 08:47:58

标签: java json serialization arraylist jackson

我正在尝试反序列化,然后序列化一个java对象。 我有一个这样的对象 -

public class Blas{
private Integer blasRootId;

private List<Bla> blaList = new ArrayList<>();

public Blas() {}

/region g & s
getter and setters ..
//endregion
}

对象 -

public class Bla{
private String fileName;
private String description;
private Integer id;

public Bla() {}

//region g & s
getter and setters ..
//endregion
}

我用

反序列化对象
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

String jsonString = mapper.writeValueAsString(Blas);

创建的json就像

{
"Blas": {
    "blasRootId": 2840,
    "blaList": [
      "java.util.ArrayList",
      [
        {
          "fileName": "RegularPayload",
          "description": "",
          "id": 2260
        }
      ]
    ]
  }
}

因此,当我尝试序列化创建的json时,出现以下错误:

Can not instantiate value of type [simple type, class Bla] from String value        ('java.util.ArrayList'); no single-String constructor/factory method

我可以让反序列化器按原样编写列表,而不添加“java.util.ArrayList”列表,或者我如何正确读取它?

更新 这是我的错误,我在“mapper.configure”中添加了一个参数(我不记得哪个)导致序列化程序添加“java.util.ArrayList”。 我的代码示例应该可以正常工作。

1 个答案:

答案 0 :(得分:1)

正如prsmax所说,这取决于代码是如何尝试反序列化blas的样子,看起来你似乎正在尝试使用blas字符串并反序列化如下:

mapper.readValue(blasStr, Bla.class)

如果您只想反序列化Bla列表,可以执行以下操作:

    JavaType javaType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, ValueType.class);
    List<ValueType> list = mapper.readValue(str, javaType);

如果你确实需要包装器对象Blas,那么你应该有一个标有@JsonCreator的构造函数,接受标有@JsonProperty的List<Bla>(还有其他方法,但这是一种失败的安全方式并使代码可读)