From d091ffa4d5e0e0cc3a7cb6d30957d5d3f69c773b Mon Sep 17 00:00:00 2001 From: Sylvester Sefa-Yeboah Date: Mon, 15 Nov 2021 13:23:48 +0000 Subject: [PATCH] noneable fundamental data numeric fields (#21) --- .../response/AnnualEarning.java | 2 + .../response/BalanceSheet.java | 74 +++++++++---------- .../fundamentaldata/response/CashFlow.java | 56 +++++++------- .../response/CompanyOverview.java | 34 +++++++++ .../response/IncomeStatement.java | 50 ++++++------- .../response/QuarterlyEarning.java | 5 ++ .../alphavantage/parser/NoneableDouble.java | 10 +++ .../parser/NoneableDoubleAdapter.java | 19 +++++ .../{Noneable.java => NoneableLong.java} | 2 +- ...eAdapter.java => NoneableLongAdapter.java} | 6 +- .../alphavantage/parser/Parser.java | 20 +++-- .../FundamentalDataResponseTest.java | 1 + .../java/fundamentaldata/data/earnings.json | 2 +- 13 files changed, 178 insertions(+), 103 deletions(-) create mode 100644 src/main/java/com/crazzyghost/alphavantage/parser/NoneableDouble.java create mode 100644 src/main/java/com/crazzyghost/alphavantage/parser/NoneableDoubleAdapter.java rename src/main/java/com/crazzyghost/alphavantage/parser/{Noneable.java => NoneableLong.java} (86%) rename src/main/java/com/crazzyghost/alphavantage/parser/{NoneableAdapter.java => NoneableLongAdapter.java} (75%) diff --git a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/AnnualEarning.java b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/AnnualEarning.java index 3aea333..5fb7d04 100644 --- a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/AnnualEarning.java +++ b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/AnnualEarning.java @@ -1,5 +1,6 @@ package com.crazzyghost.alphavantage.fundamentaldata.response; +import com.crazzyghost.alphavantage.parser.NoneableDouble; import com.squareup.moshi.Json; public class AnnualEarning { @@ -7,6 +8,7 @@ public class AnnualEarning { @Json(name="fiscalDateEnding") private String fiscalDateEnding; @Json(name="reportedEPS") + @NoneableDouble private Double reportedEPS; public String getFiscalDateEnding() { diff --git a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/BalanceSheet.java b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/BalanceSheet.java index f9b20ed..f612d11 100644 --- a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/BalanceSheet.java +++ b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/BalanceSheet.java @@ -22,7 +22,7 @@ */ package com.crazzyghost.alphavantage.fundamentaldata.response; -import com.crazzyghost.alphavantage.parser.Noneable; +import com.crazzyghost.alphavantage.parser.NoneableLong; import com.squareup.moshi.Json; public class BalanceSheet { @@ -31,112 +31,112 @@ public class BalanceSheet { @Json(name = "reportedCurrency") private String reportedCurrency; @Json(name = "totalAssets") - @Noneable + @NoneableLong private Long totalAssets; @Json(name = "totalCurrentAssets") - @Noneable + @NoneableLong private Long totalCurrentAssets; @Json(name = "cashAndCashEquivalentsAtCarryingValue") - @Noneable + @NoneableLong private Long cashAndCashEquivalentsAtCarryingValue; @Json(name = "cashAndShortTermInvestments") - @Noneable + @NoneableLong private Long cashAndShortTermInvestments; @Json(name = "inventory") - @Noneable + @NoneableLong private Long inventory; @Json(name = "currentNetReceivables") - @Noneable + @NoneableLong private Long currentNetReceivables; @Json(name = "totalNonCurrentAssets") - @Noneable + @NoneableLong private Long totalNonCurrentAssets; @Json(name = "propertyPlantEquipment") - @Noneable + @NoneableLong private Long propertyPlantEquipment; @Json(name = "accumulatedDepreciationAmortizationPPE") - @Noneable + @NoneableLong private Long accumulatedDepreciationAmortizationPPE; @Json(name = "intangibleAssets") - @Noneable + @NoneableLong private Long intangibleAssets; @Json(name = "intangibleAssetsExcludingGoodwill") - @Noneable + @NoneableLong private Long intangibleAssetsExcludingGoodwill; @Json(name = "goodwill") - @Noneable + @NoneableLong private Long goodWill; @Json(name = "investments") - @Noneable + @NoneableLong private Long investments; @Json(name = "longTermInvestments") - @Noneable + @NoneableLong private Long longTermInvestments; @Json(name = "shortTermInvestments") - @Noneable + @NoneableLong private Long shortTermInvestments; @Json(name = "otherCurrentAssets") - @Noneable + @NoneableLong private Long otherCurrentAssets; @Json(name = "otherNonCurrrentAssets") - @Noneable + @NoneableLong private Long otherNonCurrentAssets; @Json(name = "totalLiabilities") - @Noneable + @NoneableLong private Long totalLiabilities; @Json(name = "totalCurrentLiabilities") - @Noneable + @NoneableLong private Long totalCurrentLiabilities; @Json(name = "currentAccountsPayable") - @Noneable + @NoneableLong private Long currentAccountsPayable; @Json(name = "deferredRevenue") - @Noneable + @NoneableLong private Long deferredRevenue; @Json(name = "currentDebt") - @Noneable + @NoneableLong private Long currentDebt; @Json(name = "shortTermDebt") - @Noneable + @NoneableLong private Long shortTermDebt; @Json(name = "totalNonCurrentLiabilities") - @Noneable + @NoneableLong private Long totalNonCurrentLiabilities; @Json(name = "capitalLeaseObligations") - @Noneable + @NoneableLong private Long capitalLeaseObligations; @Json(name = "longTermDebt") - @Noneable + @NoneableLong private Long longTermDebt; @Json(name = "currentLongTermDebt") - @Noneable + @NoneableLong private Long currentLongTermDebt; @Json(name = "longTermDebtNoncurrent") - @Noneable + @NoneableLong private Long longTermDebtNonCurrent; @Json(name = "shortLongTermDebtTotal") - @Noneable + @NoneableLong private Long shortLongTermDebtTotal; @Json(name = "otherCurrentLiabilities") - @Noneable + @NoneableLong private Long otherCurrentLiabilities; @Json(name = "otherNonCurrentLiabilities") - @Noneable + @NoneableLong private Long otherNonCurrentLiabilities; @Json(name = "totalShareholderEquity") - @Noneable + @NoneableLong private Long totalShareholderEquity; @Json(name = "treasuryStock") - @Noneable + @NoneableLong private Long treasuryStock; @Json(name = "retainedEarnings") - @Noneable + @NoneableLong private Long retainedEarnings; @Json(name = "commonStock") - @Noneable + @NoneableLong private Long commonStock; @Json(name = "commonStockSharesOutstanding") - @Noneable + @NoneableLong private Long commonStockSharesOutstanding; public String getFiscalDateEnding() { diff --git a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/CashFlow.java b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/CashFlow.java index 9fb072a..90e2204 100644 --- a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/CashFlow.java +++ b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/CashFlow.java @@ -1,6 +1,6 @@ package com.crazzyghost.alphavantage.fundamentaldata.response; -import com.crazzyghost.alphavantage.parser.Noneable; +import com.crazzyghost.alphavantage.parser.NoneableLong; import com.squareup.moshi.Json; public class CashFlow { @@ -10,111 +10,111 @@ public class CashFlow { private String reportedCurrency; @Json(name="operatingCashflow") - @Noneable + @NoneableLong private Long operatingCashflow; @Json(name="paymentsForOperatingActivities") - @Noneable + @NoneableLong private Long paymentsForOperatingActivities; @Json(name="proceedsFromOperatingActivities") - @Noneable + @NoneableLong private Long proceedsFromOperatingActivities; @Json(name="changeInOperatingLiabilities") - @Noneable + @NoneableLong private Long changeInOperatingLiabilities; @Json(name="changeInOperatingAssets") - @Noneable + @NoneableLong private Long changeInOperatingAssets; @Json(name="depreciationDepletionAndAmortization") - @Noneable + @NoneableLong private Long depreciationDepletionAndAmortization; @Json(name="capitalExpenditures") - @Noneable + @NoneableLong private Long capitalExpenditures; @Json(name="changeInReceivables") - @Noneable + @NoneableLong private Long changeInReceivables; @Json(name="changeInInventory") - @Noneable + @NoneableLong private Long changeInInventory; @Json(name="profitLoss") - @Noneable + @NoneableLong private Long profitLoss; @Json(name="cashflowFromInvestment") - @Noneable + @NoneableLong private Long cashflowFromInvestment; @Json(name="cashflowFromFinancing") - @Noneable + @NoneableLong private Long cashflowFromFinancing; @Json(name="proceedsFromRepaymentsOfShortTermDebt") - @Noneable + @NoneableLong private Long proceedsFromRepaymentsOfShortTermDebt; @Json(name="paymentsForRepurchaseOfCommonStock") - @Noneable + @NoneableLong private Long paymentsForRepurchaseOfCommonStock; @Json(name="paymentsForRepurchaseOfEquity") - @Noneable + @NoneableLong private Long paymentsForRepurchaseOfEquity; @Json(name="paymentsForRepurchaseOfPreferredStock") - @Noneable + @NoneableLong private Long paymentsForRepurchaseOfPreferredStock; @Json(name="dividendPayout") - @Noneable + @NoneableLong private Long dividendPayout; @Json(name="dividendPayoutCommonStock") - @Noneable + @NoneableLong private Long dividendPayoutCommonStock; @Json(name="dividendPayoutPreferredStock") - @Noneable + @NoneableLong private Long dividendPayoutPreferredStock; @Json(name="proceedsFromIssuanceOfCommonStock") - @Noneable + @NoneableLong private Long proceedsFromIssuanceOfCommonStock; @Json(name="proceedsFromIssuanceOfLongTermDebtAndCapitalSecuritiesNet") - @Noneable + @NoneableLong private Long proceedsFromIssuanceOfLongTermDebtAndCapitalSecuritiesNet; @Json(name="proceedsFromIssuanceOfPreferredStock") - @Noneable + @NoneableLong private Long proceedsFromIssuanceOfPreferredStock; @Json(name="proceedsFromRepurchaseOfEquity") - @Noneable + @NoneableLong private Long proceedsFromRepurchaseOfEquity; @Json(name="proceedsFromSaleOfTreasuryStock") - @Noneable + @NoneableLong private Long proceedsFromSaleOfTreasuryStock; @Json(name="changeInCashAndCashEquivalents") - @Noneable + @NoneableLong private Long changeInCashAndCashEquivalents; @Json(name="changeInExchangeRate") - @Noneable + @NoneableLong private Long changeInExchangeRate; @Json(name="netIncome") - @Noneable + @NoneableLong private Long netIncome; public String getFiscalDateEnding() { diff --git a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/CompanyOverview.java b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/CompanyOverview.java index a999c7c..7925b53 100644 --- a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/CompanyOverview.java +++ b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/CompanyOverview.java @@ -1,5 +1,7 @@ package com.crazzyghost.alphavantage.fundamentaldata.response; +import com.crazzyghost.alphavantage.parser.NoneableDouble; +import com.crazzyghost.alphavantage.parser.NoneableLong; import com.squareup.moshi.Json; public class CompanyOverview { @@ -13,6 +15,7 @@ public class CompanyOverview { @Json(name="Description") private String description; @Json(name="CIK") + @NoneableLong private Long cik; @Json(name="Exchange") private String exchange; @@ -31,66 +34,97 @@ public class CompanyOverview { @Json(name="LatestQuarter") private String latestQuarter; @Json(name="MarketCapitalization") + @NoneableLong private Long marketCapitalization; @Json(name="EBITDA") + @NoneableLong private Long ebitda; @Json(name="PERatio") + @NoneableDouble private Double peRatio; @Json(name="PEGRatio") + @NoneableDouble private Double pegRatio; @Json(name="BookValue") + @NoneableDouble private Double bookValue; @Json(name="DividendPerShare") + @NoneableDouble private Double dividendPerShare; @Json(name="DividendYield") + @NoneableDouble private Double dividendYield; @Json(name="EPS") + @NoneableDouble private Double eps; @Json(name="RevenuePerShareTTM") + @NoneableDouble private Double revenuePerShareTTM; @Json(name="ProfitMargin") + @NoneableDouble private Double profitMargin; @Json(name="OperatingMarginTTM") + @NoneableDouble private Double operatingMarginTTM; @Json(name="ReturnOnAssetsTTM") + @NoneableDouble private Double returnOnAssetsTTM; @Json(name="ReturnOnEquityTTM") + @NoneableDouble private Double returnOnEquityTTM; @Json(name="RevenueTTM") + @NoneableLong private Long revenueTTM; @Json(name="GrossProfitTTM") + @NoneableLong private Long grossProfitTTM; @Json(name="DilutedEPSTTM") + @NoneableDouble private Double dilutedEpsTTM; @Json(name="QuarterlyEarningsGrowthYOY") + @NoneableDouble private Double quarterlyEarningsGrowthYOY; @Json(name="QuarterlyRevenueGrowthYOY") + @NoneableDouble private Double quarterlyRevenueGrowthYOY; @Json(name="AnalystTargetPrice") + @NoneableDouble private Double analystTargetPrice; @Json(name="TrailingPE") + @NoneableDouble private Double trailingPE; @Json(name="ForwardPE") + @NoneableDouble private Double forwardPE; @Json(name="PriceToSalesRatioTTM") + @NoneableDouble private Double priceToSaleRatioTTM; @Json(name="PriceToBookRatio") + @NoneableDouble private Double priceToBookRatio; @Json(name="EVToRevenue") + @NoneableDouble private Double evToRevenue; @Json(name="EVToEBITDA") + @NoneableDouble private Double evToEBITDA; @Json(name="Beta") + @NoneableDouble private Double beta; @Json(name="52WeekHigh") + @NoneableDouble private Double fiftyTwoWeekHigh; @Json(name="52WeekLow") + @NoneableDouble private Double fiftyTwoWeekLow; @Json(name="50DayMovingAverage") + @NoneableDouble private Double fiftyDayMovingAverage; @Json(name="200DayMovingAverage") + @NoneableDouble private Double twoHundredDayMovingAverage; @Json(name="SharesOutstanding") + @NoneableLong private Long sharesOutstanding; @Json(name="DividendDate") private String dividendDate; diff --git a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/IncomeStatement.java b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/IncomeStatement.java index a67d228..283e497 100644 --- a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/IncomeStatement.java +++ b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/IncomeStatement.java @@ -1,6 +1,6 @@ package com.crazzyghost.alphavantage.fundamentaldata.response; -import com.crazzyghost.alphavantage.parser.Noneable; +import com.crazzyghost.alphavantage.parser.NoneableLong; import com.squareup.moshi.Json; public class IncomeStatement { @@ -10,76 +10,76 @@ public class IncomeStatement { @Json(name="reportedCurrency") private String reportedCurrency; @Json(name="grossProfit") - @Noneable + @NoneableLong private Long grossProfit; @Json(name="totalRevenue") - @Noneable + @NoneableLong private Long totalRevenue; @Json(name="costOfRevenue") - @Noneable + @NoneableLong private Long costOfRevenue; @Json(name="costofGoodsAndServicesSold") - @Noneable + @NoneableLong private Long costofGoodsAndServicesSold; @Json(name="operatingIncome") - @Noneable + @NoneableLong private Long operatingIncome; @Json(name="sellingGeneralAndAdministrative") - @Noneable + @NoneableLong private Long sellingGeneralAndAdministrative; @Json(name="researchAndDevelopment") - @Noneable + @NoneableLong private Long researchAndDevelopment; @Json(name="operatingExpenses") - @Noneable + @NoneableLong private Long operatingExpenses; @Json(name="investmentIncomeNet") - @Noneable + @NoneableLong private Long investmentIncomeNet; @Json(name="netInterestIncome") - @Noneable + @NoneableLong private Long netInterestIncome; @Json(name="interestIncome") - @Noneable + @NoneableLong private Long interestIncome; @Json(name="interestExpense") - @Noneable + @NoneableLong private Long interestExpense; @Json(name="nonInterestIncome") - @Noneable + @NoneableLong private Long nonInterestIncome; @Json(name="otherNonOperatingIncome") - @Noneable + @NoneableLong private Long otherNonOperatingIncome; @Json(name="depreciation") - @Noneable + @NoneableLong private Long depreciation; @Json(name="depreciationAndAmortization") - @Noneable + @NoneableLong private Long depreciationAndAmortization; @Json(name="incomeBeforeTax") - @Noneable + @NoneableLong private Long incomeBeforeTax; @Json(name="incomeTaxExpense") - @Noneable + @NoneableLong private Long incomeTaxExpense; @Json(name="interestAndDebtExpense") - @Noneable + @NoneableLong private Long interestAndDebtExpense; @Json(name="netIncomeFromContinuingOperations") - @Noneable + @NoneableLong private Long netIncomeFromContinuingOperations; @Json(name="comprehensiveIncomeNetOfTax") - @Noneable + @NoneableLong private Long comprehensiveIncomeNetOfTax; @Json(name="ebit") - @Noneable + @NoneableLong private Long ebit; @Json(name="ebitda") - @Noneable + @NoneableLong private Long ebitda; @Json(name="netIncome") - @Noneable + @NoneableLong private Long netIncome; public String getFiscalDateEnding() { diff --git a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/QuarterlyEarning.java b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/QuarterlyEarning.java index d2a2588..1954eda 100644 --- a/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/QuarterlyEarning.java +++ b/src/main/java/com/crazzyghost/alphavantage/fundamentaldata/response/QuarterlyEarning.java @@ -1,5 +1,6 @@ package com.crazzyghost.alphavantage.fundamentaldata.response; +import com.crazzyghost.alphavantage.parser.NoneableDouble; import com.squareup.moshi.Json; public class QuarterlyEarning { @@ -8,12 +9,16 @@ public class QuarterlyEarning { @Json(name="reportedDate") private String reportedDate; @Json(name="reportedEPS") + @NoneableDouble private Double reportedEPS; @Json(name="estimatedEPS") + @NoneableDouble private Double estimatedEPS; @Json(name="surprise") + @NoneableDouble private Double surprise; @Json(name="surprisePercentage") + @NoneableDouble private Double surprisePercentage; public String getFiscalDateEnding() { diff --git a/src/main/java/com/crazzyghost/alphavantage/parser/NoneableDouble.java b/src/main/java/com/crazzyghost/alphavantage/parser/NoneableDouble.java new file mode 100644 index 0000000..9c331c2 --- /dev/null +++ b/src/main/java/com/crazzyghost/alphavantage/parser/NoneableDouble.java @@ -0,0 +1,10 @@ +package com.crazzyghost.alphavantage.parser; + +import com.squareup.moshi.JsonQualifier; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@JsonQualifier +public @interface NoneableDouble { } diff --git a/src/main/java/com/crazzyghost/alphavantage/parser/NoneableDoubleAdapter.java b/src/main/java/com/crazzyghost/alphavantage/parser/NoneableDoubleAdapter.java new file mode 100644 index 0000000..a199055 --- /dev/null +++ b/src/main/java/com/crazzyghost/alphavantage/parser/NoneableDoubleAdapter.java @@ -0,0 +1,19 @@ +package com.crazzyghost.alphavantage.parser; + +import com.squareup.moshi.FromJson; +import com.squareup.moshi.ToJson; + +public class NoneableDoubleAdapter { + + @ToJson + public Double toJson(@NoneableDouble Double l) { + throw new UnsupportedOperationException(); + } + + @FromJson + @NoneableDouble + public Double fromJson(String s) { + return s.equalsIgnoreCase("none") ? null: Double.valueOf(s); + } + +} diff --git a/src/main/java/com/crazzyghost/alphavantage/parser/Noneable.java b/src/main/java/com/crazzyghost/alphavantage/parser/NoneableLong.java similarity index 86% rename from src/main/java/com/crazzyghost/alphavantage/parser/Noneable.java rename to src/main/java/com/crazzyghost/alphavantage/parser/NoneableLong.java index dba484b..0e9db24 100644 --- a/src/main/java/com/crazzyghost/alphavantage/parser/Noneable.java +++ b/src/main/java/com/crazzyghost/alphavantage/parser/NoneableLong.java @@ -7,4 +7,4 @@ @Retention(RetentionPolicy.RUNTIME) @JsonQualifier -public @interface Noneable { } +public @interface NoneableLong { } diff --git a/src/main/java/com/crazzyghost/alphavantage/parser/NoneableAdapter.java b/src/main/java/com/crazzyghost/alphavantage/parser/NoneableLongAdapter.java similarity index 75% rename from src/main/java/com/crazzyghost/alphavantage/parser/NoneableAdapter.java rename to src/main/java/com/crazzyghost/alphavantage/parser/NoneableLongAdapter.java index 8b6bad5..9e6c6e0 100644 --- a/src/main/java/com/crazzyghost/alphavantage/parser/NoneableAdapter.java +++ b/src/main/java/com/crazzyghost/alphavantage/parser/NoneableLongAdapter.java @@ -3,15 +3,15 @@ import com.squareup.moshi.FromJson; import com.squareup.moshi.ToJson; -public class NoneableAdapter { +public class NoneableLongAdapter { @ToJson - public Long toJson(@Noneable Long l) { + public Long toJson(@NoneableLong Long l) { throw new UnsupportedOperationException(); } @FromJson - @Noneable + @NoneableLong public Long fromJson(String s) { return s.equalsIgnoreCase("none") ? null: Long.valueOf(s); } diff --git a/src/main/java/com/crazzyghost/alphavantage/parser/Parser.java b/src/main/java/com/crazzyghost/alphavantage/parser/Parser.java index f755a99..2a4519d 100644 --- a/src/main/java/com/crazzyghost/alphavantage/parser/Parser.java +++ b/src/main/java/com/crazzyghost/alphavantage/parser/Parser.java @@ -1,14 +1,14 @@ package com.crazzyghost.alphavantage.parser; +import com.squareup.moshi.JsonAdapter; +import com.squareup.moshi.Moshi; +import com.squareup.moshi.Types; + import java.io.IOException; import java.lang.reflect.Type; import java.util.List; import java.util.Map; -import com.squareup.moshi.JsonAdapter; -import com.squareup.moshi.Moshi; -import com.squareup.moshi.Types; - /** * @author crazzyghost * @since 1.4.0 @@ -23,7 +23,8 @@ public abstract class Parser { public static Map parseJSON(String responseBody) throws IOException { if(responseBody == null) throw new IllegalArgumentException(); Moshi moshi = new Moshi.Builder() - .add(new NoneableAdapter()) + .add(new NoneableDoubleAdapter()) + .add(new NoneableLongAdapter()) .build(); Type type = Types.newParameterizedType(Map.class, String.class, Object.class); JsonAdapter> adapter = moshi.adapter(type); @@ -33,7 +34,8 @@ public static Map parseJSON(String responseBody) throws IOExcept public static U parseJSON(String responseBody, Class c) throws IOException { if(responseBody == null) throw new IllegalArgumentException(); Moshi moshi = new Moshi.Builder() - .add(new NoneableAdapter()) + .add(new NoneableDoubleAdapter()) + .add(new NoneableLongAdapter()) .build(); Type type = Types.getRawType(c); JsonAdapter adapter = moshi.adapter(type); @@ -43,7 +45,8 @@ public static U parseJSON(String responseBody, Class c) throws IOExceptio public static List parseJSONList(Object object, Class klass) { if(object == null) throw new IllegalArgumentException(); Moshi moshi = new Moshi.Builder() - .add(new NoneableAdapter()) + .add(new NoneableDoubleAdapter()) + .add(new NoneableLongAdapter()) .build(); Type type = Types.newParameterizedType(List.class, klass); JsonAdapter> adapter = moshi.adapter(type); @@ -53,7 +56,8 @@ public static List parseJSONList(Object object, Class klass) { public static String toJSON(Map data) throws IOException { if(data == null) throw new IllegalArgumentException(); Moshi moshi = new Moshi.Builder() - .add(new NoneableAdapter()) + .add(new NoneableDoubleAdapter()) + .add(new NoneableLongAdapter()) .build(); Type type = Types.newParameterizedType(Map.class, String.class, Object.class); return moshi.adapter(type).toJson(data); diff --git a/src/test/java/fundamentaldata/FundamentalDataResponseTest.java b/src/test/java/fundamentaldata/FundamentalDataResponseTest.java index b140188..e9d33f0 100644 --- a/src/test/java/fundamentaldata/FundamentalDataResponseTest.java +++ b/src/test/java/fundamentaldata/FundamentalDataResponseTest.java @@ -176,6 +176,7 @@ public void testEarningsResponse() throws IOException { assertNotNull(annualEarning.toString()); assertEquals(annualEarning.getFiscalDateEnding(), "2020-12-31"); assertEquals(annualEarning.getReportedEPS(), 8.67, 0.0); + assertNull(response.getAnnualReports().get(1).getReportedEPS()); QuarterlyEarning quarterlyEarning = response.getQuarterlyReports().get(0); assertNotNull(quarterlyEarning.toString()); diff --git a/src/test/java/fundamentaldata/data/earnings.json b/src/test/java/fundamentaldata/data/earnings.json index bb66fc0..6d0ef5d 100644 --- a/src/test/java/fundamentaldata/data/earnings.json +++ b/src/test/java/fundamentaldata/data/earnings.json @@ -7,7 +7,7 @@ }, { "fiscalDateEnding": "2019-12-31", - "reportedEPS": "12.81" + "reportedEPS": "None" } ], "quarterlyEarnings": [