Десериализовать динамический JSON с помощью Gson TypeAdapter - PullRequest
0 голосов
/ 05 октября 2019

У меня есть POJO так:

   private String httpStatus;
   private String message;

   // getter setter
}

Мне нужно десериализовать JSON, который имеет динамический формат.

Так, например, иногда мой объект json будет выглядеть так:

{
    "httpStatus": 422,
    "message": "The given data was invalid.",
    "data": {
        "fields": {
            "user.name": [
                "The user.name field is required."
            ],
            "location.name": [
                "The location.name field is required."
            ]
        }
    }
}

И иногда будет иметь другое имя поля в fields части, например:

{
    "httpStatus": 422,
    "message": "The given data was invalid.",
    "data": {
        "fields": {
            "phone": [
                "The phone field is required."
            ]
        }
    }
}

Я пытаюсь решить эту проблему, регистрируя gson TypeAdapter, но все еще безуспешно.

final GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Error.class, new ErrorTypeAdapter());
        gsonBuilder.setPrettyPrinting();
        final Gson gson = gsonBuilder.create();

Итак, моя цель - взять информационное сообщение об ошибке от data -> fields -> phone -> получить первую строку и поместить ее в поле message.

Поэтому, когда у меня есть строка json, такая как:

String errorJson = "{\n" +
                "\"httpStatus\": 422,\n" +
                "\"message\": \"The given data was invalid.\",\n" +
                "\"data\": {\n" +
                "\"fields\": {\n" +
                "\"phone\": [\n" +
                "\"The phone field is required.\"\n" +
                "]\n" +
                "}\n" +
                "}\n" +
                "}";

И я пытаюсь десериализовать, вызывая это:

final Error error = gson.fromJson(errorJson, Book.class);
System.out.println(error.getMessage);

Это должно вывести: The phone field is required

не: The given data was invalid.

Кто-нибудь может дать мне пример того, как я создаю класс ErrorTypeAdapter для решения этой проблемы? Спасибо.

...