Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 解析JSON Swift_Ios_Json_Xcode_Parsing_Swift - Fatal编程技术网

Ios 解析JSON Swift

Ios 解析JSON Swift,ios,json,xcode,parsing,swift,Ios,Json,Xcode,Parsing,Swift,我正在开发一款显示比特币实时价格的应用程序。我使用了两个API来实现这一点——一个是纯文本,一个是JSON。我在JSON API方面遇到了一些问题 这是我的Swift代码 func BTCFallback(){ var string2 = currencySelector.currentTitle var url = NSURL(string:"https://bitpay.com/api/rates/" + (string2)!) var request = N

我正在开发一款显示比特币实时价格的应用程序。我使用了两个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。text是一个UI元素

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

发生了这样的事情:consee给出了错误
Error parsing JSON:Optional(Error Domain=NSCocoaErrorDomain code=3840)操作无法完成。(Cocoa错误3840)。“(JSON文本没有以数组或对象开头,允许未设置片段的选项。)UserInfo=0x16eb0f60{NSDebugDescription=JSON文本没有以数组或对象开头,允许未设置片段的选项。})


我做错了什么?提前谢谢

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

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

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 数据:可选(7B2236F 6465223a 22415544 222C2226E 616d6522 3a224175 73747261 6c69616e 20446f6c 6c617222 2c227261 7465223a 3430372e 39393137 7d) 费率字典:{ 代码=澳元; name=“澳元”; rate=“407.9917”; } 费率字符串:407.9917 利率是407.992
数据在传递到解析器之前是什么样子的。为什么要将数据转换为字符串,然后再转换回
JSONObjectWithData
之前的数据?2.打印JSON字符串
JSONString
,检查JSON并验证其是否为有效的JSON。@夸张地说,JSON看起来像API中的{“code”:“USD”,“name”:“US Dollar”,“rate”:376.71}。指向API的链接是@rocket101,它不能看起来像那样,否则解析器不会呕吐。确保实际传递的数据对象中包含数据。在
DataUsingEncode()之后放置一个断点,并在那里进行检查。@rocket101是的,这是编码的字符串。是否有原因不将
NSData
对象从
contentsOfURL
调用直接传递到
JSONObjectWithData()
?翻译过程中可能会丢失一些东西。