2016-03-02 3 views
21

В моем проекте андроида есть два типа ответов, в которых оба ответа идентичны, за исключением двух ключей.Gson - Прочитайте значение с двумя разными ключами

Response 1

{"fullName":"William Sherlock Scott Holmes","address":"221B Baker Street, London, England, UK","downloads":642,"rating":3,"repos":["https://link1","https://link2","https://link3"]} 

Response 2

{"name":"Sherlock","city":"London","downloads":642,"rating":3,"repos":["https://link1","https://link2","https://link3"]} 

Если вы видите ответы только две ключевые имена меняют FULLNAME/имя и адрес/город

Я дону Не хочу создавать еще одно pojo для другого ответа. Теперь мой Вопрос: Возможно ли использовать только одно Pojo для чтения обоих ответов.

public class AccountInfo { 
    private String name; 
    private String city; 
    //other objects 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getCity() { 
     return city; 
    } 

    public void setCity(String city) { 
     this.city = city; 
    } 
    //other setters and getters 
} 

Любая помощь будет оценена ...

+2

Сделать эти дополнительные поля методы получения и установки, если поле геттер пусто не будет создать любую проблему. Попробуйте это и сообщите мне, смогу ли я помочь вам чем-нибудь еще –

+1

@Rakshit спасибо. проверьте Doug Stevenson answer .. – Bharatesh

ответ

37

Вы можете аннотировать член принимать значения из двух разных имен JSon с помощью @SerializedName аннотацию:

@SerializedName(value = "name", alternate = {"fullName"}) 
private String name; 
@SerializedName(value = "city", alternate = {"address"}) 
private String city; 

Либо названного элемент может быть помещен в член, которые аннотированные как это.

ОБНОВЛЕНО: @SerializedName альтернативные имена при десериализации добавляется в Version 2.4

+0

Спасибо dude .... – Bharatesh

+0

Получение java.lang.IllegalArgumentException: Невозможно создать конвертер для класса –

0

Да вы можете сделать это в одном POJO. Попробуйте это:

public class POJO { 

@SerializedName("name") 
public String name; 

@SerializedName("city") 
public String city; 

@SerializedName("fullName") 
public String fullName; 

@SerializedName("address") 
public String address; 

@SerializedName("downloads") 
public Integer downloads; 

@SerializedName("rating") 
public Integer rating; 

@SerializedName("repos") 
public List<String> repos = new ArrayList<String>(); 

} 

В процессе анализа необходимо проверить значения для нуля. Для например -

при разборе Ответа 1: имя и город переменные будет нулевым

при разборе Ответ 2: FULLNAME и адрес будет нулевым

Примечание: Попробуйте проверить значения для null перед использованием еще вы получите nullpointerexception

+0

Большое спасибо ... @ Doug Stevenson answer больше пользы, потому что мне не нужно проверять «null». – Bharatesh

+0

Плохой подход для этого –

1

Да, вы можете полностью использовать один класс POJO для десериализации обоих ответов. Класс POJO будет содержать ключи от обоих ответов.

public class Response { 


private String name; 
private String city; 
private String fullName; 
private String address; 
private Integer downloads; 
private Integer rating; 
private List<String> repos ; 

} 

Но при использовании класса Response, быть осторожным, что для первого ответа, тем именем и города будет нулевого, и для второго, то адрес и фамилия, имя: адрес:.

0

Определить все возможные поля в вашем POJO класса как

public class AccountInfo { 
     private String name; 
     private String city; 
     private String fullname; 
     private String address; 
    } 

При проведении проверки работы на нуль в тех feilds

+0

ну. спасибо за ответ ... Но разве вы не проверяли, что другие ответы одинаковы, что вы ответили ... – Bharatesh

Смежные вопросы