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-string JSONString 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 der contentsOfURL rufen Sie direkt in JSONObjectWithData()? 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 zu data 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.

InformationsquelleAutor rocket101 | 2014-10-24
Schreibe einen Kommentar