Десериализация JSON с целочисленными ключами и строковым значением в Spring-boot

#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 для меня. Я предлагаю вам сделать то же самое, поскольку в противном случае это громоздкая задача.