JSON反序列化失败记录
概要
- 对于数组类型的数据,不要直接使用List来接收,应该使用对象,然后在对象内部使用List类型的字段来接收数据
- 在使用有内部类的对象接收数据时,内部类一定要使用静态内部类,不然无法完成实例化
问题及解决方案
在进行项目自测时,报了这么一个错误:
JSON parse error: Cannot deserialize instance of java.util.ArrayList
out of VALUE_STRING token
Postman发送的JSON数据是:
{
"imgList":[
{
"key":"xxx",
"title":"xxx",
"imgArr":[
{
"imgId":"xxx",
"imgUrl":"xxx"
}
],
"isRequired":true,
"maxLength":9
},
{
"key":"xxx",
"title":"xxx",
"imgArr":[
],
"isRequired":false,
"maxLength":9
}
]
}
由于是一个数组,所以在对应Controller中,旧代码也使用了List类型的参数,导致报错
对于List类型的数据,对应参数要使用对象,然后使用对象内List类型的字段来接收数据
将参数类型修改后,又报了:
although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor
原因是:
参数中有内部类,在反序列化时没有外部对象的实例,所以无法完成实例化,必须是静态内部类,才能在该类的内部直接new Xxx();方式来对内部类进行实例化,所以将对应参数的内部类定义为静态的即可。
Q.E.D.