【问题标题】:JSON parse error: Can not deserialize instance - JavaJSON 解析错误:无法反序列化实例 - Java
【发布时间】:2021-01-20 11:34:20
【问题描述】:

我正在创建一个接收 JSON 输入的 REST 服务,如下所示:

    [
      {
        "person": {
          "name": "string",
          "surname": "string",
          "address": "string",
          "age": "data",
          "info": {
            "number": "string"
          }
        }
      },
      {
        "person": {
          "name": "string",
          "surname": "string",
          "address": "string",
          "age": "data",
          "info": {
            "number": "string"
          }
        }
      }
    ]

我的物品是( 我省略了 getter 和 setter):

public class Request {
    private List<Person> person;        
}

public class Person{
    private String name;
    private String surname;
    private String address;
    private XMLGregorianCalendar age;
    private Info info;
}

public class Info {
    private String number;
}

我怎么会出现以下错误?

{
   "timestamp": 1611142052198,
   "status": 400,
   "error": "Bad Request",
   "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
   "message": "JSON parse error: Can not deserialize instance of com.myproject.model.Request out of 
    START_ARRAY 
}

我需要 json 结构就是这样。

【问题讨论】:

  • 您的 JSON 代表一个数组,但看起来您正试图反序列化为单个对象。
  • 它试图反序列化一个完整的Request 对象,但你应该只去它的person 字段。
  • 但我的请求是人员列表,我的课程应该是什么样的?
  • @Vlenovil 您应该反序列化为List&lt;Person&gt;(或Person[]),而不是您在此处使用的Request 类。

标签: java json rest


【解决方案1】:

您正在尝试将输入数组反序列化为 Request 对象,该对象不是集合,因此您会收到该错误。

要解决它,您应该将输入数组反序列化为 List&lt;Person&gt; 对象,然后将该对象设置为您的 Request 对象:

Request request = ... // get the request
List<Person> person = ... // deserialize the input array

request.setPerson(person);

如果您使用的是 Jackson,您还可以为您的 Request 类定义一个构造函数,该类接受一个 List&lt;Person&gt; 参数,然后使用 @JsonCreator 注释标记该构造函数(示例参见 here):

public class Request {
    private List<Person> person;

    @JsonCreator
    public Request(@JsonProperty("person") List<Person> person) {
        this.person = person;
    }
}

然后您可以直接从您的输入数组创建您的Request 对象。

通过使用@JsonCreator 注释,您可以保持Request 类不可变,因为您不需要为它定义setPerson(List&lt;Person&gt;) 方法。

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 2020-12-10
    • 1970-01-01
    • 2019-04-28
    • 2021-05-11
    • 2020-04-03
    • 2020-07-14
    • 2020-04-18
    • 2018-01-21
    相关资源
    最近更新 更多