json - 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"])]
解决方案
我想你的问题的真正答案是:如果你需要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;
}
完成。
推荐阅读
- javascript - 如何在javascript中将可读流转换为blob?
- java - 我的 .onSucceed (okhttp) 抛出“服务只能从 FX 应用程序线程中使用”
- python - 使用 lambda 使用 boto3 创建 cloudwatch 仪表板
- java - Spring boot - 使用其他项目中定义的实现
- unity3d - Unity Editor 可以在不重新加载脚本的情况下进入 PlayMode
- marklogic - Marklogic DHS 不支持哪些 MarkLogic 功能
- php - 如何使用 PayPal-PHP-SDK 设置“product_id”?
- node.js - 在窗口中运行 React Native
- react-native - 执行 npx react-native run-android 时出错
- c# - 确定文件夹 ID 是共享驱动器文件夹还是简单驱动器文件夹