簡體   English   中英

如何快速刪除此JSON包裝器?

[英]How can I remove this JSON wrapper in swift?

我目前正在迅速開發一款基本上可以用作虛擬股票交易游戲的應用程序。 使用Yahoo的YQL服務,我可以獲得所需的大部分數據。 我現在正在使用的一個特殊功能是搜索功能,以便用戶可以搜索股票行情記錄。 我正在使用Swift為IOS制作應用程序。 問題是我使用以下URL調用JSON:

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

其中在JSON數據周圍包含多余的文本“ YAHOO.Finance.SymbolSuggest.ssCallback(“和”)“,這會導致代碼無法解析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

我不知道為什么要使用downloadTaskWithURL然后使用NSData的dataWithContentsOfURL來獲取數據。 使用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()
    }

您可以將請求正文子字符串化

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-ify它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM