Подтвердить что ты не робот

Gson - прочитать значение с двумя разными ключами

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

Ответ 1

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

Ответ 2

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

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

Я не хочу создавать еще одно 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
}

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

4b9b3361

Ответ 1

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

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

Любой именованный элемент может быть помещен в элементы, которые аннотируются следующим образом.

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

Ответ 2

Да, вы можете полностью использовать один класс 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 будьте осторожны, что для первого ответа имя и город будет null strong > , а для второго адрес и имя_файла.

Ответ 3

Да, вы можете сделать это в одном 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>();

}

Во время разбора вам нужно проверить значения для null. Для eg -

В то время как переменные Parsing Response 1: имя и город будут иметь значение null

В то время как Parsing Response 2: fullname и адрес будет null

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

Ответ 4

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

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

При выполнении операции проверьте значение null в этих feilds