2015-03-23 18 views
8

Ich verwende Alamofire und SwiftyJSOn, um die JSON-Ausgabe zu analysieren. Es funktioniert sehr gut, aber einige Websites geben JSON mit Escape-Ausgabe. Ich benutze Alamofire wie unten JSON-Codierung mit umgekehrten Schrägstrichen

Alamofire.request(.POST, url, parameters: param, encoding: .JSON) 
     .responseJSON { (req, res, json, error) in 
     var json = JSON(json!) 

Website gibt mir JSON Ergebnis mit maskiertem String so SwiftyJSON es nicht dekodieren kann. Wie kann ich unter

{ 
    "d": "{\"UniqeView\":{\"ArrivalDate\":null,\"ArrivalUnitId\":null,\"DeliveryCityName\":null,\"DeliveryTownName\":null},\"ErrorMessage\":null,\"Message\":null,\"IsFound\":false,\"IsSuccess\":true}" 
} 

um so etwas wie

{ 
     "d": { 
      "UniqeView": { 
      "ArrivalDate": null, 
      "ArrivalUnitId": null, 
      "DeliveryCityName": null, 
      "DeliveryTownName": null 
      }, 
      "ErrorMessage": null, 
      "Message": null, 
      "IsFound": false, 
      "IsSuccess": true 
     } 
    } 

Antwort

3
// This Dropbox url is a link to your JSON 
// I'm using NSData because testing in Playground 
if let data = NSData(contentsOfURL: NSURL(string: "https://www.dropbox.com/s/9ycsy0pq2iwgy0e/test.json?dl=1")!) { 

    var error: NSError? 
    var response: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) 
    if let dict = response as? NSDictionary { 
     if let key = dict["d"] as? String { 

      let strData = key.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
      var error: NSError? 
      var response: AnyObject? = NSJSONSerialization.JSONObjectWithData(strData!, options: NSJSONReadingOptions.allZeros, error: &error) 

      if let decoded = response as? NSDictionary { 
       println(decoded["IsSuccess"]!) // => 1 
      } 

     } 
    } 
} 

Ich denke, Sie müssen zweimal dekodieren: das Wrapping-Objekt und seinen Inhalt.

+1

Danke für Ihre Antwort. Obwohl ich Alamofire verwende, haben Ihre Kommentare mir geholfen, das Problem zu lösen. – Meanteacher

0

i-Funktion verwenden einige benutzerdefinierte konvertieren, diese Arbeit zu tun:

import Foundation 

func unescapeString(string: String) -> String { 
    return string.stringByReplacingOccurrencesOfString("\"", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil) 
} 

Ich hoffe, es hilft;)

+3

Absolut nicht. – gnasher729

+1

es half mir für ein spezifisches Problem, wo Serialisierung tatsächlich Null zurück –

2

Lots von Menschen haben Probleme zu unterscheiden zwischen dem, was sie bekommen und was ihr System druckt. Als erstes müssen Sie herausfinden, was genau Sie erhalten und ob diese Escape-Zeichen nur ein Artefakt von Ihnen sind.

Wenn dies tatsächlich der Fall ist, hat der Server Ihnen ein Wörterbuch mit einem einzelnen Schlüssel "d" und einer Zeichenfolge gesendet, und die Zeichenfolge enthält serialisierte Daten. Konvertieren Sie in diesem Fall die Zeichenfolge in NSData, und schieben Sie sie in NSJSONSerialization, wodurch sie in das gewünschte Wörterbuch umgewandelt wird. Dies ist eine ziemlich dumme Art, JSON-Daten zu übertragen, aber es passiert.

5

@ericd Kommentare haben mir geholfen, das Problem zu lösen. Ich habe seine Antwort für diese Frage angenommen. Da ich Alamofire für den asynchronen Betrieb und SwiftyJSON verwende, konnte ich seinen Code nicht verwenden. Hier ist der Code mit Alamofire und SwiftyJSON.

Alamofire.request(.POST, url, parameters: param, encoding: .JSON) 
    .responseJSON { (req, res, json, error) in 
    if(error != nil) { 
     NSLog("Error: \(error)") 
     failure(res, json, error) 
    } 
    else { 

     var jsond = JSON(json!) 
     var data = jsond["d"].stringValue.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
     jsond = JSON(data: data!) 
+0

Wenn ich .data benutze (using: .utf8, allowLossyConversion: false), sendet es etwas wie "24 Bytes". Wie hast du es geschafft, es zum Laufen zu bringen? – RickS

0

Ich habe viel zu lange das gleiche Problem zu versuchen, herauszufinden,. Hier ist, wie ich es gelöst habe.

Ich habe einen Netzwerk-Manager, der beim Aufruf eine Antwort von [Any] zurückgibt?

Ich Schleife durch jeden Datensatz, um es in JSON konvertieren, aber das die inhärente Wörterbuchstruktur in diesem Fall nicht erkennt.

Also pflücke ich die rawString und dann Parse verwenden. Dies erkennt das Wörterbuch.

Von dort sollten Sie in der Lage sein, es wie Sie verwenden würden. In meinem Beispiel übergebe ich die Daten an ein Datenmodell (MyApi),

networkManager .requestResource(withUrl: urlPath, andParams: params, 
successHandler: { (response: [Any]?) in 

      if let rawResponse = response { 

       let mutableArray = NSMutableArray() 

       for item in rawResponse { 

        let jsonData = JSON(item) 
        guard let rawString = jsonData.rawString() else { 
         return 
        } 

        let parsedData = JSON.parse(rawString) 

       let typedResponse = MyApi(json: parsedData) 
        mutableArray.add(typedResponse) 
       } 

       let array = mutableArray.copy() as! [MyApi] 
       //do something with array 

      } else { 
       let error = NSError .init(domain: "MyApi", code: 100, userInfo: nil) 
       //log error 
      } 

     }, failureHandler: { (response: [Any]?) in 

      let error = NSError .init(domain: "MyApi", code: 101, userInfo: nil) 
      //log error 
     }) 
Verwandte Themen