Как десериализовать список объектов одного типа, но с разными именами полей в JSON с помощью Retrofit / Gson?

1

В настоящее время я использую REST API, который был создан не очень хорошо. Объект JSON quarterly должен иметь список или массив объектов внутри, но вместо этого он просто имеет объекты, которые можно адресовать по дате ("2018-09-29" и т.д.).

Я использую Retrofit2, чтобы вытянуть этот JSON в классы POJO, однако моя текущая реализация не работает, поскольку она ожидает список JSON. Я был бы признателен, если бы кто-нибудь мог помочь мне понять, как изменить мою Java, чтобы она сохраняла все квартальные объекты в списке Java.

В настоящее время список в классе CashFlowRecordList равен null т.е. он не заполняется при выполнении вызова REST.

Мой вопрос почти такой же, как: Преобразовать структуру json в массив с помощью Retrofit. Но это все еще не отвечает, как сделать это с Модернизацией.

JSON:

Cash_Flow": {
      "currency_symbol": "USD",
      "quarterly": {
        "2018-09-29": {
          "date": "2018-09-29",
          "filing_date": "2018-11-05",
          "investments": "552000000.00",
          "changeToLiabilities": "20373000000.00",
          "totalCashflowsFromInvestingActivities": "-3001000000.00",
          "netBorrowings": "-27000000.00",
          "totalCashFromFinancingActivities": "-22580000000.00",
          "changeToOperatingActivities": "-12423000000.00",
          "netIncome": "14125000000.00",
          "changeInCash": "-6058000000.00",
        },
        "2018-06-30": {
          "date": "2018-06-30",
          "filing_date": "2018-08-01",
          "investments": "7916000000.00",
          "changeToLiabilities": "1500000000.00",
          "totalCashflowsFromInvestingActivities": "3947000000.00",
          "netBorrowings": "-6011000000.00",
          "totalCashFromFinancingActivities": "-31523000000.00",
          "changeToOperatingActivities": "-5340000000.00",
          "netIncome": "11519000000.00",
          "changeInCash": "-13088000000.00",
        },
        ...
    }
}

ДЖАВА:

Денежный поток

public class CashFlow {

    public CashFlow(CashFlowRecordList quarterly, CashFlowRecordList yearly) {
        this.quarterly = quarterly;
        this.yearly = yearly;
        //
    }

    public CashFlow() {
        // TODO Auto-generated constructor stub
    }


    @SerializedName("quarterly")
    @Expose private CashFlowRecordList quarterly;

    @SerializedName("yearly")
    @Expose private CashFlowRecordList yearly;

    public CashFlowRecordList getQuarterly() {
        return quarterly;
    }

    public void setQuarterly(CashFlowRecordList quarterly) {
        this.quarterly = quarterly;
    }

    public CashFlowRecordList getYearly() {
        return yearly;
    }

    public void setYearly(CashFlowRecordList yearly) {
        this.yearly = yearly;
    }

}

CashFlowRecordList

public class CashFlowRecordList {

    @Expose public CashFlowRecord cashFlowRecord[];

    public CashFlowRecordList() {
        // TODO Auto-generated constructor stub
    }

    public CashFlowRecordList(CashFlowRecord[] cashFlowRecord){
        this.cashFlowRecord = cashFlowRecord;

    }

    public CashFlowRecord[] getCashFlowRecord() {
        return cashFlowRecord;
    }

    public void setCashFlowRecord(CashFlowRecord[] cashFlowRecord) {
        this.cashFlowRecord = cashFlowRecord;
    }
}

CashFlowRecord

public class CashFlowRecord {

    @SerializedName("date")
    @Expose
    private String date;
    @SerializedName("investments")
    @Expose
    private String investments;
    @SerializedName("changeToLiabilities")
    @Expose
    private String changeToLiabilities;
    @SerializedName("totalCashflowsFromInvestingActivities")
    @Expose
    private String totalCashflowsFromInvestingActivities;
    @SerializedName("netBorrowings")
    @Expose
    private String netBorrowings;
    @SerializedName("totalCashFromFinancingActivities")
    @Expose
    private String totalCashFromFinancingActivities;
    @SerializedName("changeToOperatingActivities")
    @Expose
    private String changeToOperatingActivities;
    @SerializedName("netIncome")
    @Expose
    private String netIncome;
    @SerializedName("changeInCash")
    @Expose
    private String changeInCash;
    @SerializedName("totalCashFromOperatingActivities")
    @Expose
    private String totalCashFromOperatingActivities;
    @SerializedName("depreciation")
    @Expose
    private String depreciation;
    @SerializedName("otherCashflowsFromInvestingActivities")
    @Expose
    private String otherCashflowsFromInvestingActivities;
    @SerializedName("dividendsPaid")
    @Expose
    private String dividendsPaid;
    @SerializedName("changeToInventory")
    @Expose
    private String changeToInventory;
    @SerializedName("changeToAccountReceivables")
    @Expose
    private String changeToAccountReceivables;
    @SerializedName("salePurchaseOfStock")
    @Expose
    private String salePurchaseOfStock;
    @SerializedName("otherCashflowsFromFinancingActivities")
    @Expose
    private String otherCashflowsFromFinancingActivities;
    @SerializedName("changeToNetincome")
    @Expose
    private String changeToNetincome;
    @SerializedName("capitalExpenditures")
    @Expose
    private String capitalExpenditures;

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getInvestments() {
        return investments;
    }

    public void setInvestments(String investments) {
        this.investments = investments;
    }

    public String getChangeToLiabilities() {
        return changeToLiabilities;
    }

    public void setChangeToLiabilities(String changeToLiabilities) {
        this.changeToLiabilities = changeToLiabilities;
    }

    public String getTotalCashflowsFromInvestingActivities() {
        return totalCashflowsFromInvestingActivities;
    }

    public void setTotalCashflowsFromInvestingActivities(String totalCashflowsFromInvestingActivities) {
        this.totalCashflowsFromInvestingActivities = totalCashflowsFromInvestingActivities;
    }

    public String getNetBorrowings() {
        return netBorrowings;
    }

    public void setNetBorrowings(String netBorrowings) {
        this.netBorrowings = netBorrowings;
    }

    public String getTotalCashFromFinancingActivities() {
        return totalCashFromFinancingActivities;
    }

    public void setTotalCashFromFinancingActivities(String totalCashFromFinancingActivities) {
        this.totalCashFromFinancingActivities = totalCashFromFinancingActivities;
    }

    public String getChangeToOperatingActivities() {
        return changeToOperatingActivities;
    }

    public void setChangeToOperatingActivities(String changeToOperatingActivities) {
        this.changeToOperatingActivities = changeToOperatingActivities;
    }

    public String getNetIncome() {
        return netIncome;
    }

    public void setNetIncome(String netIncome) {
        this.netIncome = netIncome;
    }

    public String getChangeInCash() {
        return changeInCash;
    }

    public void setChangeInCash(String changeInCash) {
        this.changeInCash = changeInCash;
    }

    public String getTotalCashFromOperatingActivities() {
        return totalCashFromOperatingActivities;
    }

    public void setTotalCashFromOperatingActivities(String totalCashFromOperatingActivities) {
        this.totalCashFromOperatingActivities = totalCashFromOperatingActivities;
    }

    public String getDepreciation() {
        return depreciation;
    }

    public void setDepreciation(String depreciation) {
        this.depreciation = depreciation;
    }

    public String getOtherCashflowsFromInvestingActivities() {
        return otherCashflowsFromInvestingActivities;
    }

    public void setOtherCashflowsFromInvestingActivities(String otherCashflowsFromInvestingActivities) {
        this.otherCashflowsFromInvestingActivities = otherCashflowsFromInvestingActivities;
    }

    public String getDividendsPaid() {
        return dividendsPaid;
    }

    public void setDividendsPaid(String dividendsPaid) {
        this.dividendsPaid = dividendsPaid;
    }

    public String getChangeToInventory() {
        return changeToInventory;
    }

    public void setChangeToInventory(String changeToInventory) {
        this.changeToInventory = changeToInventory;
    }

    public String getChangeToAccountReceivables() {
        return changeToAccountReceivables;
    }

    public void setChangeToAccountReceivables(String changeToAccountReceivables) {
        this.changeToAccountReceivables = changeToAccountReceivables;
    }

    public String getSalePurchaseOfStock() {
        return salePurchaseOfStock;
    }

    public void setSalePurchaseOfStock(String salePurchaseOfStock) {
        this.salePurchaseOfStock = salePurchaseOfStock;
    }

    public String getOtherCashflowsFromFinancingActivities() {
        return otherCashflowsFromFinancingActivities;
    }

    public void setOtherCashflowsFromFinancingActivities(String otherCashflowsFromFinancingActivities) {
        this.otherCashflowsFromFinancingActivities = otherCashflowsFromFinancingActivities;
    }

    public String getChangeToNetincome() {
        return changeToNetincome;
    }

    public void setChangeToNetincome(String changeToNetincome) {
        this.changeToNetincome = changeToNetincome;
    }

    public String getCapitalExpenditures() {
        return capitalExpenditures;
    }

    public void setCapitalExpenditures(String capitalExpenditures) {
        this.capitalExpenditures = capitalExpenditures;
    }

}
Теги:
retrofit2
serialization
gson

1 ответ

1
Лучший ответ

Ваше quarterly в JSON может быть десериализовано как Map<String, CashFlowRecord>. Так что меняйте тип ежеквартально и соответственно делайте рефакторинг остальной части кода. Поэтому вам не обязательно нужен какой-либо пользовательский класс реализации List, такой как CashFlowRecordList.

В зависимости от ваших потребностей вы также можете попробовать Map<Date, CashFlowRecord>. Это может сработать, если вам нужно, чтобы ключи были сконструированы как объекты Date.

  • 0
    Это фантастика, большое спасибо за ваш простой ответ. Я очень испугался, что мне придется сделать некоторую страшную пользовательскую десериализацию, так как другие ответы StacOverflow намекали на
  • 0
    @ ShaneMonksO'Byrne Np. Также полезно знать, что вы можете десериализовать любой JSON - полностью или частично - как Объект с Gson. Это приведет к com.google.gson.internal.LinkedTreeMap .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню