首页 > 解决方案 > SpringBoot JSON 没有反序列化到我的请求模型中

问题描述

我正在使用 SpringBoot 并尝试反序列化 JSON,例如:

{
  "userId": "Dave",
  "queryResults": {
    "id": "ABC",
    "carData": {.....},
    "carId": "Honda",
    "status": 0,
    "model": "X"
  }
}

,进入MyRequestModel类:

public class MyRequestModel {
   private String userId;
   private String: queryResults;
}

,在我的方法中作为@RequestBody参数接收,如下所示:@PostMapping

    @PostMapping
    public String postDate(@RequestBody MyRequestModel data) {
        ...
        
        return "posted";
    }

上述queryResults字段应该作为 CLOB 存储在数据库中。

我遇到的问题是,如果我发送此 JSON 以命中我的端点(PostMapping)方法,它无法将其反序列化MyRequestModel并出现此错误:

无法java.lang.String在 [Source: (PushbackInputStream); 处反序列化超出 START_OBJECT 令牌的实例;行:3,列:18](通过引用链:MyRequestModel["queryResults"])]

标签: jsonspring-bootspring-data-jpa

解决方案


我想你的问题的真正答案是:如果你需要queryResults属性是 a String,那么实现一个自定义反序列化器。

如果不是,那么请使用 Jonatan 和 Montaser 在其他答案中提出的替代方案之一。

在 Spring Boot 中实现自定义反序列化器相当简单,因为 Jackson 是它的默认序列化器/反序列化器,它提供了一种编写我们自己的反序列化器的简单方法。

首先,创建一个实现的类StdDeserializer<T>

MyRequestModelDeserializer.java

public class MyRequestModelDeserializer extends StdDeserializer<MyRequestModel> {

    public MyRequestModelDeserializer() {
        this(null);
    }

    public MyRequestModelDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public MyRequestModel deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = p.getCodec().readTree(p);

        String userId = node.get("userId").asText();
        String queryResults = node.get("queryResults").toString();

        MyRequestModel model = new MyRequestModel();
        model.setQueryResults(queryResults);
        model.setUserId(userId);

        return model;
    }

}

其次,使用@JsonDeserialize注释将您的类标记为使用自定义反序列化器进行反序列化:

MyRequestModel.java

@JsonDeserialize(using = MyRequestModelDeserializer.class)
public class MyRequestModel {
    private String userId;
    private String queryResults;
}

完成。


推荐阅读