我正在尝试反序列化,然后序列化一个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”。 我的代码示例应该可以正常工作。
答案 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>
(还有其他方法,但这是一种失败的安全方式并使代码可读)