Skip to main content
 首页 » 操作系统

ios之解析 JSON Swift

2024年01月01日43zhujiabin

我正在开发一个显示实时比特币价格的应用程序。我正在使用 2 个 API 来执行此操作 - 一个纯文本和一个 JSON。我在使用 JSON API 时遇到了一些问题。

这是我的一些 Swift 代码

func BTCFallback(){ 
 
    var string2 = currencySelector.currentTitle 
 
 
    var url = NSURL(string:"https://bitpay.com/api/rates/" +  (string2)!) 
    var request = NSURLRequest(URL: url) 
 
 
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:fallback) 
 
    var data = NSData(contentsOfURL:url); 
    let value = NSString(string: USD.text).doubleValue / NSString(data:data, encoding:NSUTF8StringEncoding).doubleValue 
 
    // Define JSON string 
    var JSONString = "\(data)" 
 
    // Get NSData using string 
    if let JSONData = JSONString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { 
 
        // Parse JSONData into JSON object 
        var parsingError: NSError? 
    if let JSONObject = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &parsingError) as? [String: AnyObject] { 
 
        // If the parsing was successful grab the rate object 
        var rateObject: AnyObject? = JSONObject["rate"] 
 
        // Make sure the rate object is the expected type 
        if let rate = rateObject as? Float { 
            println("rate is \(rate)") 
            BTC.text = "\(rate)" 
        } 
    } else { 
 
        // There was an error parsing the JSON data 
        println("Error parsing JSON: \(parsingError)") 
        BTC.text = "err1" 
    } 
 
} 
 
 
 
 
 
 
} 

在上面的代码中,currencySelector.currentTitle 等于 ISO 货币代码,例如 USD。 BTC.text 是一个 UI 元素。

预期的行为是代码会将“rate”的对应项设置为 BTC.text 的文本。如果这有帮助,API 会返回类似于 {"code":"USD","name":"US Dollar","rate":376.71} 的内容。我希望使用上面的示例将 BTC.text 设置为 376.71

事情是这样的:consoe 给出了错误 解析 JSON 时出错:Optional(Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn't be completed. (Cocoa error 3840.)"(JSON 文本未以数组或对象开头,并且未设置允许片段的选项。 ) UserInfo=0x16eb0f60 {NSDebugDescription=JSON 文本未以数组或对象开头,并且未设置允许片段的选项。})

我做错了什么?提前致谢!

请您参考如下方法:

这都是处理返回数据和反序列化的问题。

这里是示例代码,注意Optionals的处理应该更好,这只是为了演示基本代码。出于示例目的,我使用了一个简单的同步网络调用。:

var url: NSURL! = NSURL(string:"https://bitpay.com/api/rates/AUD") 
var request = NSURLRequest(URL: url) 
var response: NSURLResponse? 
var error: NSError? 
var data: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error) 
println("data: \(data)") 
 
if let data: NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error) { 
    println("data: \(data)") 
 
    var parsingError: NSError? 
    if let rateDictionary = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parsingError) as NSDictionary? { 
        println("rateDictionary: \(rateDictionary)") 
 
        // If the parsing was successful grab the rate object 
        if var rateString: AnyObject = rateDictionary["rate"] { 
            println("rateString: \(rateString)") 
 
            // Make sure the rate object is the expected type 
            if let rate = rateString.floatValue { 
                println("rate is \(rate)") 
            } 
        } 
    } 
} 

输出:

data: Optional(7b22636f 6465223a 22415544 222c226e 616d6522 3a224175 73747261 6c69616e 20446f6c 6c617222 2c227261 7465223a 3430372e 39393137 7d) 
 
rateDictionary: { 
    code = AUD; 
    name = "Australian Dollar"; 
    rate = "407.9917"; 
} 
 
rateString: 407.9917 
 
rate is 407.992