首页 > 解决方案 > 如何使用 Retrofit/Gson 反序列化 JSON 中相同类型但具有不同字段名称的对象列表?

问题描述

我目前使用的 REST API 构造得不是很好。JSON 对象quarterly内部应该有一个对象列表或数组,但它只包含可按日期寻址的对象(“2018-09-29”等)。

我正在使用 Retrofit2 将此 JSON 拉入 POJO 类,但是我当前的实现无法正常工作,因为它需要一个 JSON 列表。如果有人可以帮助我了解如何更改我的 java 以便它将所有季度对象存储在 java 列表中,我将不胜感激。

目前CashFlowRecordList课堂上的列表是null- 即。进行 REST 调用时未填充。

我的问题与以下内容几乎相同:使用 Retrofit 将 json 结构转换为数组。但它仍然没有回答如何使用改造。

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;
    }

}

现金流量记录表

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;
    }
}

现金流量记录

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;
    }

}

标签: androidjsonserializationgsonretrofit2

解决方案


quarterly的 in JSON 可以反序列化为Map<String, CashFlowRecord>. 因此,更改 Quarterly 的类型并相应地重构其余代码。因此,您不一定需要任何自定义 List 实现类,例如CashFlowRecordList.

根据您的需要,您也可以尝试Map<Date, CashFlowRecord>. 如果您需要将键构造为Date对象,它可能会起作用。


推荐阅读