在我的代码中,我正在做一个保护语句,所以我可以遍历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 回答
好的 . 因此,您正在从JSON访问
query
,这是一个JSON对象 . 那些被映射到NSDictionaries,因此对[AnyObject]
的强制转换必然会失败 .把它投到
NSDictionary
,你会没事的 .