2015-11-24 2 views
1

В моем коде я делаю инструкцию охраны, поэтому я могу прокручивать 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%' } } 
+0

Вы могли бы предоставить данные json? Кажется, что вещь, которую вы пытаетесь внедрить в массив, - это объект JSON, а не массив. – SmokeDispenser

+0

@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

+0

Это не работает для завивки. Не могли бы вы просто зарегистрировать данные, которые вы на самом деле разбираете как строку UTF8, и соответственно изменить свой вопрос? – SmokeDispenser

ответ

3

Хорошо. Итак, вы получаете доступ к query из этого JSON, который является объектом JSON. Те получают сопоставление с NSDictionaries, поэтому приведение к [AnyObject] связано с ошибкой.

Откажитесь от NSDictionary, и все будет в порядке.

Смежные вопросы