David Gordon
David Gordon

Reputation: 287

Retrofit POJO empty

Can anyone see why my s.getSymbol() error returns null in this code?

The json prints to the terminal fine and there are no runtime errors when creating the 'quote'.

However trying to access it's members throws a null pointer.

Do I need to include all nodes of the JSON in my POJO? For instance if I only wanted the Symbol could I only have that data member as long as it's setter and getter?

Thank you

Retorfit Interface     
   public class RetrofitInterface {
       private static StockApiInterface sStockService;

       public static StockApiInterface getStockApiClient() {
           if (sStockService == null) {
                 RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint("http://query.yahooapis.com/v1/public")
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
            sStockService = restAdapter.create(StockApiInterface.class);
       }

    return sStockService;
}

     public interface StockApiInterface {
        @GET("/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20
              (\"AIB.IR\")%0A%09%09&format=json&diagnostics=false&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=")                               
                 quote listQuotes();
}

MainActivity

    quote q = RetrofitInterface.getStockApiClient().listQuotes();
    if(q.getSymbol()== null){
        System.out.println("Null");
    }

JSON

{"query":{"count":1,"created":"2014-11-17T11:06:28Z","lang":"en-US","results":{"quote":{"symbol":"AIB.IR","Ask":"0.105","AverageDailyVolume":"812179","Bid":"0.103","AskRealtime":"0.105","BidRealtime":"0.103","BookValue":"0.00","Change_PercentChange":"0.00 - 0.00%","Change":"0.00","Commission":null,"Currency":"EUR","ChangeRealtime":"0.00","AfterHoursChangeRealtime":"N/A - N/A","DividendShare":"0.00","LastTradeDate":"11/17/2014","TradeDate":null,"EarningsShare":"0.00","ErrorIndicationreturnedforsymbolchangedinvalid":null,"EPSEstimateCurrentYear":"0.00","EPSEstimateNextYear":"0.00","EPSEstimateNextQuarter":"0.00","DaysLow":"0.101","DaysHigh":"0.108","YearLow":"0.075","YearHigh":"0.166","HoldingsGainPercent":"- - -","AnnualizedGain":null,"HoldingsGain":null,"HoldingsGainPercentRealtime":"N/A - N/A","HoldingsGainRealtime":null,"MoreInfo":"n","OrderBookRealtime":null,"MarketCapitalization":null,"MarketCapRealtime":null,"EBITDA":"0","ChangeFromYearLow":"+0.028","PercentChangeFromYearLow":"+37.33%","LastTradeRealtimeWithTime":"N/A - <b><img src=http://eur.i1.yimg.com/eur.yimg.com/i/eu/f/e.gif width=11 height=13 border=0>0.103</b>","ChangePercentRealtime":"N/A - 0.00%","ChangeFromYearHigh":"-0.063","PercebtChangeFromYearHigh":"-37.95%","LastTradeWithTime":"5:40am - <b>0.103</b>","LastTradePriceOnly":"0.103","HighLimit":null,"LowLimit":null,"DaysRange":"0.101 - 0.108","DaysRangeRealtime":"N/A - N/A","FiftydayMovingAverage":"0.00","TwoHundreddayMovingAverage":"0.00","ChangeFromTwoHundreddayMovingAverage":null,"PercentChangeFromTwoHundreddayMovingAverage":null,"ChangeFromFiftydayMovingAverage":null,"PercentChangeFromFiftydayMovingAverage":null,"Name":"ALLIED IRISH BANK","Notes":null,"Open":"0.101","PreviousClose":"0.103","PricePaid":null,"ChangeinPercent":"0.00%","PriceSales":null,"PriceBook":null,"ExDividendDate":null,"PERatio":null,"DividendPayDate":null,"PERatioRealtime":null,"PEGRatio":null,"PriceEPSEstimateCurrentYear":null,"PriceEPSEstimateNextYear":null,"Symbol":"AIB.IR","SharesOwned":null,"ShortRatio":null,"LastTradeTime":"5:40am","TickerTrend":"&nbsp;+++-+-&nbsp;","OneyrTargetPrice":null,"Volume":"228977","HoldingsValue":null,"HoldingsValueRealtime":null,"YearRange":"0.075 - 0.166","DaysValueChange":"- - 0.00%","DaysValueChangeRealtime":"N/A - N/A","StockExchange":"Irish","DividendYield":null,"PercentChange":"0.00%"}}}}

POJO

 public class quote {

     @Expose
     private String symbol;
     @Expose
     private String Ask;
     @Expose
     private String AverageDailyVolume;
     @Expose
     private String Bid;
     @Expose
     private String AskRealtime;
     .....
     //includes all elements and setters and getter

Upvotes: 2

Views: 884

Answers (2)

Florian Barth
Florian Barth

Reputation: 1392

http://www.jsonschema2pojo.org/ generated the following (shortened) POJOS, that should be parseable:

public class ResultWrapper {
Query query;
(...)
}

public class Query {

private Integer count;
private String created;
private String lang;
private Results results;

(...)
}

public class Results {

// you might wanna make this an array in your json and a List here
private Quote quote;
(...)

}

public class Quote {

private String symbol;
private String Ask;
private String AverageDailyVolume;
private String Bid;
private String AskRealtime;
private String BidRealtime;
private String BookValue;
private String ChangePercentChange;
private String Change;
private Object Commission;
private String Currency;
private String ChangeRealtime;
private String AfterHoursChangeRealtime;
private String DividendShare;
private String LastTradeDate;
private Object TradeDate;
private String EarningsShare;
private Object ErrorIndicationreturnedforsymbolchangedinvalid;
private String EPSEstimateCurrentYear;
private String EPSEstimateNextYear;
private String EPSEstimateNextQuarter;
private String DaysLow;
private String DaysHigh;
private String YearLow;
private String YearHigh;
private String HoldingsGainPercent;
private Object AnnualizedGain;
private Object HoldingsGain;
private String HoldingsGainPercentRealtime;
private Object HoldingsGainRealtime;
private String MoreInfo;
private Object OrderBookRealtime;
private Object MarketCapitalization;
private Object MarketCapRealtime;
private String EBITDA;
private String ChangeFromYearLow;
private String PercentChangeFromYearLow;
private String LastTradeRealtimeWithTime;
private String ChangePercentRealtime;
private String ChangeFromYearHigh;
private String PercebtChangeFromYearHigh;
private String LastTradeWithTime;
private String LastTradePriceOnly;
private Object HighLimit;
private Object LowLimit;
private String DaysRange;
private String DaysRangeRealtime;
private String FiftydayMovingAverage;
private String TwoHundreddayMovingAverage;
private Object ChangeFromTwoHundreddayMovingAverage;
private Object PercentChangeFromTwoHundreddayMovingAverage;
private Object ChangeFromFiftydayMovingAverage;
private Object PercentChangeFromFiftydayMovingAverage;
private String Name;
private Object Notes;
private String Open;
private String PreviousClose;
private Object PricePaid;
private String ChangeinPercent;
private Object PriceSales;
private Object PriceBook;
private Object ExDividendDate;
private Object PERatio;
private Object DividendPayDate;
private Object PERatioRealtime;
private Object PEGRatio;
private Object PriceEPSEstimateCurrentYear;
private Object PriceEPSEstimateNextYear;
private String Symbol;
private Object SharesOwned;
private Object ShortRatio;
private String LastTradeTime;
private String TickerTrend;
private Object OneyrTargetPrice;
private String Volume;
private Object HoldingsValue;
private Object HoldingsValueRealtime;
private String YearRange;
private String DaysValueChange;
private String DaysValueChangeRealtime;
private String StockExchange;
private Object DividendYield;
private String PercentChange;

(...)
}

Then modify your retrofit interface to

public interface StockApiInterface {
        @GET("/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(\"AIB.IR\")%0A%09%09&format=json&diagnostics=false&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=")                               
                 ResultWrapper listQuotes();
}

You can now access the quote with:

ResultWrapper result = RetrofitInterface.getStockApiClient().listQuotes();
Quote q = q.getQuery().getResults().getQuote();

Upvotes: 1

Mohammad Rahchamani
Mohammad Rahchamani

Reputation: 5220

I think you need to parse this model :

public class query {
   int count;
   String created;
   String lang;
   Quote results;
   .
   .
   .

Upvotes: 0

Related Questions