2015-03-23 10 views
8

Utilizzo di Alamofire e SwiftyJSOn per analizzare l'output JSON. Funziona molto bene, tuttavia alcuni siti forniscono JSON con output sfuggito. Io uso Alamofire come qui di seguito Codifica JSON con barre rovesciate

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

sito mi dà risultato JSON con stringa di escape in modo SwiftyJSON non può decodificarlo. Come posso convertire sotto

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

a qualcosa di simile

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

risposta

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 
      } 

     } 
    } 
} 

Immagino di dover decodificare due volte: l'oggetto wrapping e il suo contenuto.

+1

Grazie per la risposta. Anche se utilizzo Alamofire, i tuoi commenti mi hanno aiutato a risolvere il problema. – Meanteacher

0

Faccio uso di alcune funzioni personalizzate per fare questo lavoro:

import Foundation 

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

Spero che aiuta;)

+3

Assolutamente no. – gnasher729

+1

mi ha aiutato per un problema specifico in cui la serializzazione in realtà restituisce nulla –

2

Lotti di persone hanno problemi a distinguere tra ciò che ricevono e ciò che il loro sistema stampa. Quindi, per prima cosa, devi scoprire che cosa stai ricevendo esattamente e se questi personaggi di escape sono o meno un artefatto della tua stampa.

Se questo è ciò che effettivamente si riceve, il server ha inviato un dizionario con una sola chiave "d" e una stringa e la stringa contiene dati serializzati. In tal caso, converti la stringa in NSData e inseriscila in NSJSONSerialization, che la trasformerà nel dizionario che desideri. Questo è un modo piuttosto stupido per trasmettere dati JSON, ma succede.

5

I commenti di @ericd mi hanno aiutato a risolvere il problema. Ho accettato la sua risposta per questa domanda. Dal momento che sto usando Alamofire per operazioni asincrone e SwiftyJSON, non ho potuto usare il suo codice. Ecco il codice con Alamofire e 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

Quando uso .data (usando: .utf8, allowLossyConversion: false) invia qualcosa come "24 byte". Come sei riuscito a farlo funzionare? – RickS

0

Ho passato troppo tempo a cercare di capire lo stesso problema. Ecco come l'ho risolto.

Ho un gestore di rete che quando chiamato, restituisce una risposta di [Qualsiasi]?

I loop attraverso ogni record, convertendolo in JSON, ma in questo caso non riconosce la struttura del dizionario inerente.

Quindi mi prendo il rawString e quindi utilizzo il parse. Questo riconosce il dizionario.

Da lì si dovrebbe essere in grado di usarlo come si farebbe. Nel mio esempio, trasmetto i dati a un modello di dati (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 
     }) 
Problemi correlati