JsonMappingException: не карта, не массив или не перечисление - PullRequest
0 голосов
/ 16 марта 2020

Я работаю над приложением rest api, и у меня есть некоторые проблемы с кодом. Я хочу вернуть объект, который расширяет схему avro и добавляет ссылки HATEOAS к ответу. Я провел некоторое исследование, и, как оказалось, мне нужен собственный сериализатор для объекта.

Часть кода, который проблематичен c:

@JsonValue
public String serialize() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(this);
}

Это возвращает

Не могу написать JSON: Не перечисление.

Текущий объект является расширением схемы avro. Я также пытался:

@JsonValue
public String serialize() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(getUserData());
}

Возвращает:

Не удалось записать JSON: Не массив

Где пользовательские данные являются фактическими авро объект. Я не понимаю, что означают эти ошибки. Может кто-нибудь объяснить? Кроме того, есть ли лучший способ вернуть объект avro в сочетании с другими параметрами?

Спасибо

РЕДАКТИРОВАТЬ:

Вот полный пример:

public class PaginatedUserData extends UserDataAvro {
    @JsonValue
    public String serialize() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        HashMap<String, String> map = new HashMap<>();
        map.put("test", "5");
        return mapper.writeValueAsString(map);
    }
}

Возвращает:

Невозможно записать JSON: не массив

1 Ответ

0 голосов
/ 18 марта 2020

Джексон может быть проблематичным c иногда. Эти ошибки означают, что весенняя загрузка ожидает данные, отличные от данных в вашем результате.

Вы должны вернуть объект, имеющий в качестве свойства схему avro, например:

class UserResponse extends ResourceSupport {
  UserData userData;
  public void getUserData() { ... }
}

Затем вы возвращаете это в контроллер:

return new UserResponse();

Если это все еще не работает для вас, я предлагаю вам использовать Gson . Для вашего приложения это будет выглядеть примерно так:

Gson gson = new Gson();
UserResponse data = new UserResponse();

String json = gson.toJson(data.getUserData());
...