2016-11-06 117 views
0

我想從服務器獲取json並將其反序列化,但我嘗試使用未轉義的控制字符。 我的代碼如下...swift非轉義控制字符

let urlFinal = "http://000.0000.000.000:8080" 
     let jsonUrl = urlFinal 
     let session = NSURLSession.sharedSession() 
     let shotsUrl = NSURL(string: jsonUrl) 

     let task = session.dataTaskWithURL(shotsUrl!) {data, response, error in 
      guard data != nil else { 
       falha() 
       return 
      } 

      //let json = JSON(data: data!) 
      //print(json["ServicoCliente"][0]["id"]) 

      do { 
       let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) 
       let J = jsonData as! NSDictionary 
       print(jsonData) 
       let us = J["ServicoCliente"] 
       print(us) 
       dispatch_async(dispatch_get_main_queue(),{ 
        sucesso() 
       }); 
      } catch _ { 
       falha() 
      } 
     } 
     task.resume() 

,我也試過這種使用Alamofire 3.0:

Alamofire.request(.GET, "http://000.000.000.000/", parameters: nil) 
    .responseJSON { response in 
     debugPrint(response)  // prints detailed description of all response properties 

     print(response.request) // original URL request 
     print(response.response) // URL response 
     print(response.data)  // server data 
     print(response.result) // result of response serialization 

     if let JSON = response.result.value { 
      print("JSON: \(JSON)") 
     } 
} 

而得到這個錯誤:

Unescaped control character around character 263

如何刪除字符不逃逸?

我用X-代碼7.3.1和SWIFT 2.3

UPDATE: 的Json

{"ServicoCliente":[{"id":"195","cliente":"247","enderecoFavoritos":"48","servicoProfissional":"194","ind_estado_cliente":"A","ind_estado_profissional":"","profissional_id":"240","profissional_nome":"PetMax","servicotipo_nome":"Petshop","servicosubtipo_nome":"Tosa ","dta_inc_alt":"2016-11-05 22:56:19.333","ind_finalizado":"N"}]} 
+0

我認爲你的JSON無效,請嘗試將此objc代碼轉換爲Swift http://stackoverflow.com/a/11192483/6366256 –

+0

請將您的JSON字符串粘貼到此處,這有助於我們調查您的問題。 – Enix

+0

我用json更新了,但是在我的一個測試中,我複製並粘貼了textField中的json,然後工作。我認爲該字符在複製或automaticamet中丟失轉換爲文本字段@Enix –

回答

2

爲了解決這個問題,必須轉換爲字符串數據,刪除字符,然後轉換成的dataonly然後反序列化

let urlFinal = "http://000.0000.000.000:8080" 
let jsonUrl = urlFinal 
let session = NSURLSession.sharedSession() 
let shotsUrl = NSURL(string: jsonUrl) 

let task = session.dataTaskWithURL(shotsUrl!) {data, response, error in 
guard data != nil else { 
    falha() 
    return 
} 

var dataToString = String(data: data!, encoding: NSUTF8StringEncoding) 
dataToString = stringByRemovingControlCharacters2(dataToString!) 
let ndata = dataToString!.dataUsingEncoding(NSUTF8StringEncoding) 

do { 
    let jsonData = try NSJSONSerialization.JSONObjectWithData(ndata!, options: NSJSONReadingOptions.MutableContainers) 
    let J = jsonData as! NSDictionary 
    print(jsonData) 
    let us = J["ServicoCliente"] 
    print(us) 
    dispatch_async(dispatch_get_main_queue(),{ 
     sucesso() 
    }); 
} catch _ { 
    falha() 
} 
} 
task.resume() 

,並添加功能

func stringByRemovingControlCharacters2(string: String) -> String { 
let controlChars = NSCharacterSet.controlCharacterSet() 
var range = string.rangeOfCharacterFromSet(controlChars) 
var mutable = string 
while let removeRange = range { 
    mutable.removeRange(removeRange) 
    range = mutable.rangeOfCharacterFromSet(controlChars) 
} 

return mutable 
}