Я изучаю использование GSON Google для моего проекта Android, который запросит JSON с моего веб-сервера. JSON вернулся будет либо ...GSON: зная, какой тип объекта нужно преобразовать?
1) Успешный ответ известного типа (например, класс "User"):
{
"id":1,
"username":"bob",
"created_at":"2011-01-31 22:46:01",
"PhoneNumbers":[
{
"type":"home",
"number":"+1-234-567-8910"
},
{
"type":"mobile",
"number":"+1-098-765-4321"
}
]
}
2.) Неудачный ответ, который всегда будет взять на себя одна и та же базовая структура ниже.
{
"error":{
"type":"Error",
"code":404,
"message":"Not Found"
}
}
Я хотел бы GSON преобразовать к нужному типу в зависимости от наличия пары error
ключ/значение выше. Самый практичный способ, который я могу сделать, состоит в следующем, но мне любопытно, есть ли лучший способ.
final String response = client.get("http://www.example.com/user.json?id=1");
final Gson gson = new Gson();
try {
final UserEntity user = gson.fromJson(response, UserEntity.class);
// do something with user
} catch (final JsonSyntaxException e) {
try {
final ErrorEntity error = gson.fromJson(response, ErrorEntity.class);
// do something with error
} catch (final JsonSyntaxException e) {
// handle situation where response cannot be parsed
}
}
Это действительно просто псевдокод, хотя, потому что в первом состоянии поймать, я не знаю, как проверить, существует ли ключ error
в ответ JSON. Поэтому я думаю, что мой вопрос двоякий:
- Могу ли я/как использовать GSON для проверки существования ключа и принять решение о том, как на нем разбираться?
- Это то, что другие в подобной ситуации делают с GSON, или есть лучший способ?
Изменение кода ошибки должно быть простым в том, как настроено мое веб-приложение. Мне придется поиграть и выяснить, удалит ли ключ «ошибка» в результате JSON или что-то вроде выше, будет лучше для меня. Огромное спасибо за ваш подробный ответ, я очень ценю это! –
Чтобы следить за тем, чтобы мой веб-сервер не возвращал статус HTTP 200 всякий раз, когда ожидается ответ об ошибке, и я изменил ответ на ошибку JSON, чтобы не включать в себя инкапсулирующую клавишу «ошибка», включая только «тип», код "и" сообщение ". Сейчас все работает так, как хотелось бы. Спасибо за помощь! –
Практически, но JsonDeserializer - это интерфейс, поэтому вам нужно его реализовать, а не расширять. –