将POJO改装为空

时间:2014-11-17 12:15:28

标签: android json pojo retrofit

有人可以在此代码中看到我的s.getSymbol()错误返回null的原因吗?

json 打印到终端正常,创建'quote'时没有运行时错误。

但是尝试访问它的成员会抛出一个空指针。

我是否需要在POJO中包含 JSON 的所有节点?例如,如果我只想要符号,我可以只拥有该数据成员,只要它是setter和getter?

谢谢

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

2 个答案:

答案 0 :(得分:1)

http://www.jsonschema2pojo.org/生成了以下(缩短的)POJOS,它应该是可解析的:

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;

(...)
}

然后将您的改装界面修改为

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

您现在可以通过以下方式访问报价:

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

答案 1 :(得分:0)

我认为你需要解析这个模型:

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