解析JSON Swift [英] Parsing JSON Swift

查看:166
本文介绍了解析JSON Swift的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一款显示实时比特币价格的应用。我使用2个API来执行此操作 - 一个明文和一个JSON。我在使用JSON API时遇到了一些麻烦。

I am working on an app that displays the live Bitcoin price. I am using 2 APIs to do this - one plaintext, and one JSON. I am having a bit of trouble with the JSON API.

这里有一些我的Swift代码

Here's a bit of my Swift code

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元素。

In the above code, currencySelector.currentTitle is equal to an ISO currency code, for instance USD. BTC.text is a UI element.

预期的行为是代码将rate的对应部分设置为BTC.text的文本。如果这有帮助,API返回类似{code:USD,name:US Dollar,rate:376.71}。我想要,使用上面的例子,将BTC.text设置为376.71

The expected behavior is that the code will set the counterpart of "rate" as the text of BTC.text. In case this helps, the API returns something like {"code":"USD","name":"US Dollar","rate":376.71}. I would want, using the above example, to have BTC.text set to 376.71

这是发生了什么:consoe给出错误
解析JSON时出错:可选(错误域= NSCocoaErrorDomain Code = 3840操作无法完成。(Cocoa error 3840。)(JSON文本没有以数组或对象开头,并且选项允许未设置片段。)UserInfo = 0x16eb0f60 {NSDebugDescription = JSON文本没有以数组或对象开头,并且选项允许未设置片段。})

Here's what's happening: the consoe gives the error Error parsing JSON: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x16eb0f60 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})

我在做什么错误?在此先感谢!

What am I doing wrong? Thanks in advance!

推荐答案

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

It is all a matter of handling the returned data and de-serialization.

这是示例代码,请注意Optionals的处理应该更好,这只是为了演示基本代码。例如,我使用了一个简单的同步Web调用。:

Here is example code, note that the handling of Optionals should be better, this is just to demonstrate the basic code. For example purposes I used a simple synchronous web call.:

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

这篇关于解析JSON Swift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆