如何从 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