В моем коде я делаю инструкцию охраны, поэтому я могу прокручивать JSON и получать нужные данные, но я продолжаю получать сообщение об ошибке «Не могу отличить значение типа», __NSCFDictionary 'to' NSArray '. " Вот мой код:Не могу отличить значение типа _NCSFDictionary до NSArray Swift 2
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: 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%' } }
Вы могли бы предоставить данные json? Кажется, что вещь, которую вы пытаетесь внедрить в массив, - это объект JSON, а не массив. – SmokeDispenser
@JanGreve Конечно, https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22goog%22)&format = json & diagnostics = true & env = store% 3A% 2F% 2Fdatatables.org% 2Falltableswithkeys & callback = Это URL-адрес для значения акций Alphabet, в моем коде я использую \ (тиккер), где goog можно найти, чтобы я мог вводить пользователя при получении данные. – HarryMoy
Это не работает для завивки. Не могли бы вы просто зарегистрировать данные, которые вы на самом деле разбираете как строку UTF8, и соответственно изменить свой вопрос? – SmokeDispenser