首页 文章

无法将类型_NCSFDictionary的值转换为NSArray Swift 2

提问于
浏览
1

在我的代码中,我正在做一个保护语句,所以我可以遍历JSON并获取我想要的数据但是我一直收到一条错误,上面写着“无法将类型'__ NSCFDictionary'的值转换为'NSArray' . ”这是我的代码:

urlSession.dataTaskWithURL(urlWithJSON, completionHandler: {(data, response, error) -> Void in
     do {
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! NSDictionary
        guard let query:[AnyObject] = json["query"] as! [AnyObject] else {
             throw StockError.InvalidArray
         }

我强迫转发到NSDictionary,因为我需要获取JSON数据中特定项的键,当试图强制向下转换为NSArray时,我得到一个关于它期望int的错误 .

编辑:以下是用于获取JSON数据的JavaScript代码:var sync = require(“sync-request”);

var urlBeginning = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22";
var urlEnding = "%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=";

var getStockValue = function(symbol) {
    var url = urlBeginning + symbol + urlEnding;
    var res = sync('GET', url);
    var data = JSON.parse(res.getBody().toString('utf8'));
    console.log(data);
    console.log(data.query.results);
};

getStockValue("GOOG");

哪个输出:

{ query: 
   { count: 1,
     created: '2015-11-24T10:13:49Z',
     lang: 'en-US',
     diagnostics: 
      { url: [Object],
        publiclyCallable: 'true',
        cache: [Object],
        query: [Object],
        javascript: [Object],
        'user-time': '30',
        'service-time': '10',
        'build-version': '0.2.311' },
     results: { quote: [Object] } } }
{ quote: 
   { symbol: 'GOOG',
     Ask: '754.13',
     AverageDailyVolume: '2244760',
     Bid: '749.49',
     AskRealtime: null,
     BidRealtime: null,
     BookValue: '169.03',
     Change_PercentChange: '-0.62 - -0.08%',
     Change: '-0.62',
     Commission: null,
     Currency: 'USD',
     ChangeRealtime: null,
     AfterHoursChangeRealtime: null,
     DividendShare: null,
     LastTradeDate: '11/23/2015',
     TradeDate: null,
     EarningsShare: '23.72',
     ErrorIndicationreturnedforsymbolchangedinvalid: null,
     EPSEstimateCurrentYear: '28.99',
     EPSEstimateNextYear: '34.22',
     EPSEstimateNextQuarter: '7.80',
     DaysLow: '751.82',
     DaysHigh: '762.71',
     YearLow: '486.23',
     YearHigh: '762.71',
     HoldingsGainPercent: null,
     AnnualizedGain: null,
     HoldingsGain: null,
     HoldingsGainPercentRealtime: null,
     HoldingsGainRealtime: null,
     MoreInfo: null,
     OrderBookRealtime: null,
     MarketCapitalization: '519.91B',
     MarketCapRealtime: null,
     EBITDA: '23.30B',
     ChangeFromYearLow: '269.75',
     PercentChangeFromYearLow: '+55.48%',
     LastTradeRealtimeWithTime: null,
     ChangePercentRealtime: null,
     ChangeFromYearHigh: '-6.73',
     PercebtChangeFromYearHigh: '-0.88%',
     LastTradeWithTime: '4:00pm - <b>755.98</b>',
     LastTradePriceOnly: '755.98',
     HighLimit: null,
     LowLimit: null,
     DaysRange: '751.82 - 762.71',
     DaysRangeRealtime: null,
     FiftydayMovingAverage: '696.65',
     TwoHundreddayMovingAverage: '614.49',
     ChangeFromTwoHundreddayMovingAverage: '141.49',
     PercentChangeFromTwoHundreddayMovingAverage: '+23.03%',
     ChangeFromFiftydayMovingAverage: '59.33',
     PercentChangeFromFiftydayMovingAverage: '+8.52%',
     Name: 'Alphabet Inc.',
     Notes: null,
     Open: '757.45',
     PreviousClose: '756.60',
     PricePaid: null,
     ChangeinPercent: '-0.08%',
     PriceSales: '7.25',
     PriceBook: '4.48',
     ExDividendDate: null,
     PERatio: '31.87',
     DividendPayDate: null,
     PERatioRealtime: null,
     PEGRatio: '1.48',
     PriceEPSEstimateCurrentYear: '26.08',
     PriceEPSEstimateNextYear: '22.09',
     Symbol: 'GOOG',
     SharesOwned: null,
     ShortRatio: '1.81',
     LastTradeTime: '4:00pm',
     TickerTrend: null,
     OneyrTargetPrice: '853.67',
     Volume: '1415536',
     HoldingsValue: null,
     HoldingsValueRealtime: null,
     YearRange: '486.23 - 762.71',
     DaysValueChange: null,
     DaysValueChangeRealtime: null,
     StockExchange: 'NMS',
     DividendYield: null,
     PercentChange: '-0.08%' } }

1 回答

  • 3

    好的 . 因此,您正在从JSON访问 query ,这是一个JSON对象 . 那些被映射到NSDictionaries,因此对 [AnyObject] 的强制转换必然会失败 .

    把它投到 NSDictionary ,你会没事的 .

相关问题