Как разобрать Json с полем, связывающим несколько видов объектов - PullRequest
0 голосов
/ 10 июня 2019

Как проанализировать Json с полем «data», которое может содержать несколько типов объектов, или объект и простое сообщение (вне структуры объекта).

Приложение Android запрашивает информацию у своего бэкенда,В большинстве случаев ответ имеет ту же структуру, и если поле «данные» содержит только один вид объекта, я могу завершить процесс.

Но если поле «данные» содержит несколько видов объектов или один объект с внешним сообщением, я не могу его проанализировать.

Структура нормального ответа (я могу проанализировать эти случаи):

{
    "success": true,
    "code": "OK",
    "error": null,
    "data": {
        "_type": "auth",
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlzcyI6Im9mZnRpbWUiLCJzdWIiOiJkZXZlbG9wZXIifQ==.eyJyb2xlIjpbImFwcCJdLCgfgdfgJhcgdfgdfAiOiJPRkZUSU1FIEFuZHJvaWQiLCJvd25lcdsgsghhjghkukI6Ik9zY2FyIn0=.7PiMEmX8M3ABs7P8KymuXvBpTL1gdgdfLRajFbwxP5IBARM=",
        "refresh": null,
        "logout": null
    }
}

Ответ с объектом "пользователь" и сообщением (у меня проблемы с его анализом):

{
    "success": true,
    "code": "USER_ALREADY_EXISTS",
    "error": null,
    "data": {
        "user": {
            "_type": "user",
            "id": 32,
            "name": "Pascual22",
            "email": "pascual22@juanedc.com",
            "picture": null
        },
        "message": "This email is already registered, you will receive an email with the reset password instructions"
    }
}

Ответ с несколькими видами объектов (у меня проблемы с его анализом):

{
    "success": true,
    "code": "OK",
    "error": null,
    "data": {
        "auth": {
            "_type": "auth",
            "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlzcyI6Im9mZnRpbWUiLCJzdWIiOiJ1c2VyIiwiZXhwIjoxNTYwNTk2MzUwfQ==.eyJyb2xlIjpbImFwcCIsInVzZXIiXSwib3duZXIiOjI2LCJkZXZpY2UiOiI5In0=.JxbidqCnZNCt8eyRUbLE8HEJKeWgwFejz/9rMJPoKS0=",
            "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlzcyI6Im9mZnRpbWUiLCJzdWIiOiJ1c2VyIiwiZXhwIjoxNTYwNzY5MTUwfQ==.eyJyb2xlIjpbImFwcCIsInVzZXIiLCJyZWZyZXNoIl0sIm93bmVyIjoyNiwiZGV2aWNlIjoiOSIsInJlZnJlc2giOiJleUowZVhBaU9pSktWMVFpTENKaGJHY2lPaUpJVXpJMU5pSXNJbWx6Y3lJNkltOW1ablJwYldVaUxDSnpkV0lpT2lKMWMyVnlJaXdpWlhod0lqb3hOVFl3TlRrMk16VXdmUT09LmV5SnliMnhsSWpwYkltRndjQ0lzSW5WelpYSWlYU3dpYjNkdVpYSWlPakkyTENKa1pYWnBZMlVpT2lJNUluMD0uSnhiaWRxQ25aTkN0OGV5UlViTEU4SEVKS2VXZ3dGZWp6XC85ck1KUG9LUzA9In0=.JBTIyHAtVS8PgH7LzUzL3TTg8yoe7vVMBH6eauPgc7o=",
            "logout": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlzcyI6Im9mZnRpbWUiLCJzdWIiOiJ1c2VyIiwiZXhwIjoxNTYwNTk2MzUwfQ==.eyJyb2xlIjpbImFwcCIsInVzZXIiLCJsb2dvdXQiXSwib3duZXIiOjI2LCJkZXZpY2UiOiI5IiwibG9nb3V0IjoiZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUlzSW1semN5STZJbTltWm5ScGJXVWlMQ0p6ZFdJaU9pSjFjMlZ5SWl3aVpYaHdJam94TlRZd05UazJNelV3ZlE9PS5leUp5YjJ4bElqcGJJbUZ3Y0NJc0luVnpaWElpWFN3aWIzZHVaWElpT2pJMkxDSmtaWFpwWTJVaU9pSTVJbjA9Lkp4YmlkcUNuWk5DdDhleVJVYkxFOEhFSktlV2d3RmVqelwvOXJNSlBvS1MwPSJ9.syuKoi8XiHp/me/AJAydyXfRbXa63KVWqPSKS7ySGQc="
        },
        "user": {
            "_type": "user",
            "id": 26,
            "name": "Sin Foto 2",
            "email": "sf2@yopmail.com",
            "picture": null
        },
        "device": {
            "_type": "device",
            "id": "9",
            "category": "mobile",
            "manufacturer": "Xiaomi",
            "model": "Mi A1",
            "os": "android",
            "os_version": "9",
            "sim_support": true,
            "name": null,
            "added": "2019-06-10 10:59:10"
        }
    }
}

Мой ответ класса:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response {

    @JsonProperty("success")
    private String success;
    @JsonProperty("code")
    private String code;
    @JsonProperty("error")
    private String error;

    @JsonProperty("data")
    private Object data;

    public String getSuccess() {return success;}

    public void setSuccess(String success) {this.success = success;}

    public String getCode() {return code;}

    public void setCode(String code) {this.code = code;}

    public String getError() {return error;}

    public void setError(String error) {this.error = error;}

    public Object getData() {return data;}

    public void setData(Object data) {this.data = data;}

}

Начальный процесс синтаксического анализа (от Json до объекта Response, с использованием пружины для платформы Android):

responseApi = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, Response.class);

ПарсингОбработка поля данных для объектов (пример с пользовательским объектом в «data»):

try {
                        User user = mapper.convertValue(responseApi.getBody().getData(), User.class);
}
catch (Exception e){
e.printStackTrace();
}

Я попытался создать класс Data с универсальным объектом и атрибутами сообщения, но он не работает,Мне нужно проанализировать ответ во всех случаях, как я могу его достичь?Некоторые предложения о структуре класса для правильного процесса автоматического разбора?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...