Ios 解析JSON Swift
我正在开发一款显示比特币实时价格的应用程序。我使用了两个API来实现这一点——一个是纯文本,一个是JSON。我在JSON API方面遇到了一些问题 这是我的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
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()
?翻译过程中可能会丢失一些东西。