【发布时间】:2014-10-24 15:19:51
【问题描述】:
我正在开发一个显示实时比特币价格的应用程序。我正在使用 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 给出了错误
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.})
我做错了什么?提前致谢!
【问题讨论】:
-
数据在传入解析器之前是什么样子的?
-
1.为什么要将数据转换为字符串,然后再转换为
JSONObjectWithData之前的数据? 2. 打印 JSON 字符串JSONString并检查 JSON 并验证它是有效的 JSON。 -
@Hyperbole JSON 看起来像 API 中的 {"code":"USD","name":"US Dollar","rate":376.71}。 API 的链接是bitpay.com/api/rates/USD
-
@rocket101 不能这样看,否则解析器不会出错。确保您实际上传递了一个包含数据的数据对象。在
dataUsingEncoding()之后放置一个断点并在那里检查。 -
@rocket101 是的,这就是编码的字符串。您是否有理由不将
contentsOfURL调用中的NSData对象直接传递给JSONObjectWithData()?翻译中可能会丢失一些东西。
标签: ios json xcode parsing swift