Parsen von JSON-Swift
Arbeite ich an einer app, die zeigt das Leben der Bitcoin-Preis. Ich bin mit 2 APIs - ein Klartext, und eine JSON. Ich habe ein bisschen Probleme mit der JSON-API.
Hier ist ein bisschen von meinen 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"
}
}
}
In dem obigen code, currencySelector.currentTitle gleich ein ISO-Währungs-code, zum Beispiel USD. BTC.text ist ein UI-element.
Das erwartete Verhalten ist, dass der code wird gesetzt, das Gegenstück zu "bewerten", wie der text von BTC.text. In diesem Fall hilft, die API gibt so etwas wie {"- code":"USD","name":"US-Dollar","rate":376.71}. Ich würde mir wünschen, mit den oben genannten beispielsweise BTC.text festgelegt 376.71
Hier ist, was passiert: die consoe gibt den Fehler
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.})
Was mache ich falsch? Vielen Dank im Voraus!
- Was bedeutet die Daten Aussehen bevor es weitergegeben wird in den parser?
- 1. Warum sind Sie konvertieren die Daten in einen string und dann wieder zurück, um die Daten vor
JSONObjectWithData
? 2. println dem JSON-stringJSONString
und untersuchen Sie die JSON und stellen Sie sicher, dass es gültig ist JSON. - Das JSON sieht wie {"- code":"USD","name":"US-Dollar","rate":376.71} aus der API. Einen link zu der API ist bitpay.com/api/rates/USD
- Es kann nicht so Aussehen, dass sonst der parser würde nicht barf. Stellen Sie sicher, dass Sie tatsächlich an ein Daten-Objekt, das Daten enthält. Setzen Sie einen breakpoint nach
dataUsingEncoding()
und überprüfen Sie es. - wenn ich println JSONString, es gibt <7b22636f 6465223a 22415544 222c226e 616d6522 3a224175 73747261 6c69616e 20446f6c 6c617222 2c227261 7465223a 3430392e 3738347d> . Irgendwelche Ideen, warum? Es ist ein link im obigen Kommentar, wenn Sie brauchen, um einen Blick in die API...
- wenn ich println JSONString, es gibt <7b22636f 6465223a 22415544 222c226e 616d6522 3a224175 73747261 6c69616e 20446f6c 6c617222 2c227261 7465223a 3430392e 3738347d> . Irgendwelche Ideen, warum? Es ist ein link im obigen Kommentar, wenn Sie brauchen, um einen Blick in die API...
- JSONString ist ein NSData-Objekt. Das ist, warum druckt es so.
- Ja, das ist der string codiert ist. Gibt es einen Grund, warum Sie nicht in die Weitergabe der
NSData
Objekt aus dercontentsOfURL
rufen Sie direkt inJSONObjectWithData()
? So etwas könnte in der übersetzung verloren. - Ohne Grund - versucht so. Einen moment
- Wenn Sie brauchen, habe ich einen Haltepunkt zu: postimg.org/image/k0lsfv6ih
- Sorry, ich bin neu in swift. Wie kann ich einstellen das code-wie Sie vorgeschlagen?
- Versuchen Sie, ändern Sie den ersten parameter von
JSONObjectWithData
zudata
wie diese:NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parsingError)
- Konvertieren des hex-Daten in eine Zeichenfolge: {"code":"AUD","name":"Australischer Dollar","rate":409.784} ist gültige JSON mit der top-level-Objekt, das ein Wörterbuch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist alles eine Sache der Handhabung der zurückgegebenen Daten und de-Serialisierung.
Hier ist der Beispiel-code, beachten Sie, dass der Umgang mit Optionen sollte besser sein, dies ist nur zu zeigen, die basic-code. Zum Beispiel Zwecke benutzte ich eine einfache, synchrone web-call.:
Ausgabe: