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.


Read The Fucking Source Code!