代码之家  ›  专栏  ›  技术社区  ›  Shane Monks O'Byrne

如何用revent/gson反序列化JSON中相同类型但字段名不同的对象列表?

  •  1
  • Shane Monks O'Byrne  · 技术社区  · 7 年前

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

    我正在使用retrofit2将这个JSON拉入POJO类中,但是我当前的实现并没有工作,因为它需要一个JSON列表。如果有人能帮助我理解如何更改Java,以便将所有的季度对象存储在Java列表中,我将不胜感激。

    当前列表位于 CashFlowRecordList 类是 null -也就是说,其余的电话都打不通。

    我的问题与以下问题基本相同: Convert json structure to array with Retrofit . 但它仍然无法回答如何进行改装。

    杰森:

    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;
        }
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   pirho    7 年前

    你的 quarterly 在json中,可以反序列化为 Map<String, CashFlowRecord> . 因此,每季度更改一次类型,并相应地重构代码的其余部分。因此,您不一定需要像这样的任何自定义列表实现类 CashFlowRecordList .

    根据您的需要,您也可以尝试 Map<Date, CashFlowRecord> . 如果需要将键构造为 Date 物体。