2014-12-15 4 views
-1

В настоящее время я делаю приложение в быстром, которое по сути функционирует как виртуальная торговая игра. Я смог получить большую часть данных, которые мне нужны, с помощью службы YQL Yahoo. Особенностью, над которой я сейчас работаю, является функция поиска, чтобы пользователи могли искать тикер акций. Я делаю приложение для IOS с помощью Swift. Проблема в том, я называю JSON, используя этот адрес:Как я могу удалить эту обертку JSON в swift?

http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=f&callback=YAHOO.Finance.SymbolSuggest.ssCallback

который включает в себя дополнительный текст «YAHOO.Finance.SymbolSuggest.ssCallback (» и «)» вокруг данных JSON, который вызывает код не в состоянии проанализировать данные JSON. Как я могу удалить это? Заранее спасибо.

Вот мой код:

let callURL = NSURL(string: "http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=f&callback=YAHOO.Finance.SymbolSuggest.ssCallback") 

    var errorEncountered: Bool = false 
    var downloadFinished: Bool = false 
    var arrayOfStockResults: [[String]] = [] 

    let sharedSession = NSURLSession.sharedSession() 
    let downloadTask: NSURLSessionDownloadTask = 
    sharedSession.downloadTaskWithURL(callURL!, completionHandler: { 
     (location: NSURL!, response: NSURLResponse!, error: NSError!) 
     -> Void in 

     if (error != nil) { 
      errorEncountered = true 
     } 

     if (errorEncountered == false) { 
      let dataObject = NSData(contentsOfURL: location)      

      let stocksDictionary = 
      NSJSONSerialization.JSONObjectWithData(dataObject!, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary 

      println(stocksDictionary) 

      if (error != nil) { 
       errorEncountered = true 
      } 
      downloadFinished = true 

ответ

2

Я не знаю, почему вы используете downloadTaskWithURL, а затем используете данные NSDataWithContentsOfURL для получения данных. Проще использовать dataTaskWithURL. Следующий код работал для меня, чтобы загрузить данные, преобразовать их в строку, обрезать эту строку, чтобы удалить ненужный текст, преобразовать эту строку обратно в объект NSData и, наконец, получить словарь.

var sharedSession: NSURLSession! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let callURL = NSURL(string: "http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=f&callback=YAHOO.Finance.SymbolSuggest.ssCallback") 

     var arrayOfStockResults: [[String]] = [] 

     sharedSession = NSURLSession.sharedSession() 
     let downloadTask: NSURLSessionDataTask = sharedSession.dataTaskWithURL(callURL!, completionHandler: { (data, response, error) -> Void in 

      if error != nil { 
       println(error) 
      }else{ 
       var jsonError: NSError? 
       var text: NSString = NSString(data: data, encoding: 4)! 
       var range = text.rangeOfString("ssCallback") 
       var subtext: NSString = text.substringFromIndex(range.location + range.length) 
       var finalText = subtext.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "()")) // trim off the parentheses at both ends 
       var trimmedData = finalText.dataUsingEncoding(4, allowLossyConversion: false) 
       if let stocksDictionary = NSJSONSerialization.JSONObjectWithData(trimmedData!, options: .AllowFragments, error: &jsonError) as? NSDictionary { 
        println(stocksDictionary) 
       }else{ 
        println(jsonError) 
       } 
      } 
     }) 
     downloadTask.resume() 
    } 
+0

Это решило проблему! Большое вам спасибо, вы спасатель. Это также позволяет мне получить доступ к другой информации, которая была обернута таким образом. Не могу вас поблагодарить! –

+0

Можете ли вы изменить этот код, чтобы его можно было использовать в swift 3.0? Я пытаюсь сделать что-то подобное из Листа Google Данные выглядят примерно так: http://pastebin.com/raw/5CCFQLgJ – Greg432

0

Вы можете подстроки тело запроса

let startIndex = //enough to cut out yahoo prepend 
let endIndex = //enough to cut off that ending paren 

//assuming some data variable for request body 
data.substringWithRange(Range<String.Index>(start: startIndex, end: endIndex)) 

затем JSON-римента его!

+0

Я не уверен, как бы это сделать. Теперь я добавил свой текущий код к вопросу. когда я пытаюсь использовать .substringWithRange, xcode говорит, что мой объект данных не имеет члена этого типа –

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

  • Нет связанных вопросов^_^