如何从 START_OBJECT 令牌中反序列化 java.lang.String 的实例
Posted
技术标签:
【中文标题】如何从 START_OBJECT 令牌中反序列化 java.lang.String 的实例【英文标题】:How to deserialize instance of java.lang.String out of START_OBJECT token 【发布时间】:2019-05-13 19:11:04 【问题描述】:我有一个 json:
"clientId": "1",
"appName": "My Application",
"body": "Message body",
"title": "Title"
"data":
"key1": "value1",
"key2": "value2"
还有一个 DTO:
@Data
public class PushNotificationDto
private Long clientId;
private String appName;
private String body;
private String title;
private String data;
我正在使用 SpringBoot,我的 @RestController 看起来像这样:
@RestController
@AllArgsConstructor
public class PushNotificationController
private PushNotificationService pushNotificationService;
@PostMapping("/push-notification")
void sendPushNotification(@RequestBody PushNotificationDto pushNotification)
pushNotificationService.send(pushNotification);
由于 json 对象中的数据字段实际上是一个对象,但在我的 DTO 中它是一个字符串,我得到一个异常:
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error:
Can not deserialize instance of java.lang.String out of START_OBJECT token;
nested exception is com.fasterxml.jackson.databind.JsonMappingException:
Can not deserialize instance of java.lang.String out of START_OBJECT token
我该怎么做才能使这种反序列化成功执行?
【问题讨论】:
您可以将data
字段类型更改为Object
,这最终会将其反序列化为LinkedHashMap
。最佳实践可能包括拥有一个实际的 POJO,您可以使用它对其进行反序列化,并在反序列化之外处理 String
转换。
【参考方案1】:
在您的请求对象中,您有一个 data
数组。
"data":
"key1": "value1",
"key2": "value2"
但是在你的PushNotificationDto
对象中你有String data
。这就是您收到此错误的原因。要解决此错误,您可以将String data
更改为Map<String,String>
【讨论】:
【参考方案2】:这也可能是部署问题。如果你在修改后部署了 pojo,使用这个 pojo 的服务仍然使用旧的类文件,那么就会出现问题。如果这是你。然后先部署pojo,再部署所有正在使用它的服务。这就是发生在我身上的事。
【讨论】:
以上是关于如何从 START_OBJECT 令牌中反序列化 java.lang.String 的实例的主要内容,如果未能解决你的问题,请参考以下文章
无法从 START_OBJECT 令牌中反序列化 int[] 的实例
无法从 START_OBJECT 令牌中反序列化 `java.lang.Boolean` 的实例
无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例
JSON 解析错误:无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例
无法读取文档:无法从 START_OBJECT 令牌中反序列化 java.lang.String 的实例
com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从 START_OBJECT 令牌中反序列化 `java.util.Arra