Как проанализировать 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 с универсальным объектом и атрибутами сообщения, но он не работает,Мне нужно проанализировать ответ во всех случаях, как я могу его достичь?Некоторые предложения о структуре класса для правильного процесса автоматического разбора?