Как десериализовать экземпляр java.lang.String из токена START_OBJECT - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть 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

Что я могу сделать, чтобы такая десериализация прошла успешно?

1 Ответ

0 голосов
/ 12 декабря 2018

В вашем объекте запроса у вас есть массив data.

"data": {
  "key1": "value1",
  "key2": "value2"
}

Но в вашем PushNotificationDto объекте у вас есть String data.Вот почему вы получаете эту ошибку.Чтобы устранить эту ошибку, вы можете изменить String data на Map<String,String>

...