#java #spring-boot #fasterxml
#java #spring-boot #fasterxml
Вопрос:
Я должен де-сериализовать и сериализовать обратно простой JSON, имеющий целочисленный ключ и строковое значение в Spring-boot, используя библиотеку Feign. Я знаю, что если ключ находится в String, это довольно просто в Spring-boot с автоматической сериализацией и десериализацией. Мой JSON выглядит как :
"avatar": {
"48x48": "https://wfrjira.int.abc.com/secure/useravatar?ownerId=personamp;avatarId=1234",
"24x24": "https://wfrjira.int.abc.com/secure/useravatar?size=smallamp;ownerId=personamp;avatarId=1234"
}
Мой компонент POJO с надлежащим классом getters и setters является :
class Avatar {
private String _48x48;
private String _24x24;
public Avatar() {
}
public Avatar(String _48x48, String _24x24) {
this._48x48 = _48x48;
this._24x24 = _24x24;
} Getters and Setter ...
Я получаю следующую ошибку :
Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500). Ошибка при извлечении ответа для типа [class [Lcom.XXXXXX.JiraResourceData;] и типа контента [application/json; charset=UTF-8]; вложенным исключением является org.springframework.http.converter.Исключение HttpMessageNotReadableException: ошибка синтаксического анализа JSON: не удается десериализовать экземпляр
[Lcom.XXXXXX.JiraResourceData;
из токена START_OBJECT; вложенным исключением является исключение com.fasterxml.jackson.databind.exc.MismatchedInputException: не удается десериализовать экземпляр[Lcom.XXXXXX.JiraResourceData;
из токена START_OBJECT в [Источник: (PushbackInputStream); строка: 1, столбец: 1] feign.codec.Исключение DecodeException: ошибка при извлечении ответа для типа [class [Lcom.XXXXXX.JiraResourceData;] и типа контента [application /json; charset=UTF-8]; вложенным исключением является org.springframework.http.converter.Исключение HttpMessageNotReadableException: ошибка синтаксического анализа JSON: не удается десериализовать экземпляр[Lcom.XXXXXX.JiraResourceData;
из токена START_OBJECT; вложенным исключением является исключение com.fasterxml.jackson.databind.exc.MismatchedInputException: не удается десериализовать экземпляр[Lcom.XXXXXX.JiraResourceData;
из токена START_OBJECT в [Источник: (PushbackInputStream); строка: 1, столбец: 1]
Я понимаю, что мне нужно объявить переменные в классе Avatar с именем, соответствующим ключам JSON, но строки не могут быть объявлены, начиная с числового. Есть ли какой-либо другой способ решить эту проблему в Spring-boot? Любая помощь будет оценена.
Комментарии:
1. Вы можете написать свой собственный десериализатор.
Ответ №1:
Прежде всего, в вашей последней JSON
строке есть запятая. Удалите это. Кроме того, JSON
должен быть встроен в другой набор скобок.
Кроме того, аннотируйте свой класс с помощью, @JsonRootName("avatar")
поскольку ваш класс прописной, а ваш JSON
строчный.
Кроме того, вы, вероятно, захотите переименовать свои поля в имена полей в JSON
или прокомментировать их с помощью @JsonProperty("my-json-name")
Комментарии:
1. Запятая была опечаткой, я ее исправил. На самом деле я извлек JSON из большего JSON, в котором другие элементы представляют собой обычные пары строкового ключа и строкового значения. Проблема с переименованием этих строковых полей заключается в том, что строковое поле не может быть чем-то, начинающимся с числа.
2. Хорошо, обычно при преобразовании JSON в DTO я лично использую плагины в IntelliJ для копирования в JSON, и это создаст DTO для меня. Я предлагаю вам сделать то же самое, поскольку в противном случае это громоздкая задача.