2016-09-26 3 views
9

Ich habe ein Problem mit Sonderzeichen mit Alamofire 4.
Die JSON enthält æ, ø und å und der Browser zeigt sie in Ordnung, auch meine vorherige Lösung mit SwiftyJSON tat.

Alamofire 4 zeigt etwas Ähnliches statt:Alamofire 4 und Sonderzeichen in JSON

U00e6 

diesem Aufruf:

Alamofire.request(specificURL, method: .get, parameters: param, encoding: URLEncoding.default, headers: nil).responseJSON { (response: DataResponse<Any>) in 
    print(response) 
} 

Was dies zu tun zu lösen?

+2

sind Sie sicher, dass Ihre json richtig auf UTF8 codiert ist? –

+0

Ja, da der Browser und meine vorherige Lösung mit SwiftyJSON alles richtig zeigt. – Recusiwe

+1

@Recusiwe Überprüfen Sie meine Antwort. –

Antwort

6

Edit:

Alamofire.request(url, method: .get, parameters: param, encoding: JSONEncoding.default) 
     .responseJSON { response in 

      switch response.result { 
      case .success(let value) : 

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

       if let JSON = response.result.value as! [String:AnyObject]!{ 
        print("JSON: ",JSON) 
        self.arrUser = Mapper<Users>().mapArray(JSONArray:JSON["user"] as! [[String : Any]])! 
        self.tableView.reloadData() 
       } 
      case .failure(let encodingError): 
       //Print error 
      } 
    } 

Ich habe das Problem, das ich æ in Json Antwort hinzugefügt haben, und versuchen Sie zu drucken.

Ausgang:

JSON: Optional(<__NSArrayI 0x600000050320>(
{ 
    "email_address" = "[email protected]"; 
    username = "testwts06 \U00e6"; 
}, 
{ 
    "email_address" = "[email protected]"; 
    username = "testwts01 \U00eb"; 
}, 
{ 
    "email_address" = "[email protected]"; 
    username = testwts100; 
}) 

Beim Anzeigen von ihm in der richtigen Format angezeigt werden soll.

image

+0

Ich kann nicht scheinen, ein Mitglied der oben genannten zu finden? Meine spezifische URL ist nur eine Zeichenfolge. – Recusiwe

+0

@Recusiwe Ich habe meine Antwort aktualisiert. Bitte überprüfen Sie –

+0

Wenn ich die Codierung auf JSONEncoding setzen, druckt es keine einzige Sache in diesem'Aramofire.request (specificURL, Methode: .get, Parameter: param, Codierung: JSONEncoding.default) .responseJSON {Antwort in drucken (response.result) } } 'Ich habe die URL in meinem Browser überprüft, und alles ist in Ordnung. – Recusiwe

1

Swift 3 Update für Antwort Ekta ist:

let encodedURL = specificURL.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) 
1

scheint die typische Serialisierung Fehler durch falsche JSON-Codierung, wahrscheinlich die Antwortstatuscode ist 3840.

JSON Der Text muss in UTF-8, UTF-16 oder UTF-32 codiert sein.

Sie könnten versuchen, die Antwortdaten zu konvertieren UTF8-Codierung zu korrigieren:

let datastring = NSString(data: response.data!, encoding: String.Encoding.isoLatin1.rawValue) 
let data = datastring!.data(using: String.Encoding.utf8.rawValue) 
do { 
    let object = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) 
    let jsonDic = object as! NSDictionary 
    print(" ok, successfully converted..\(jsonDic)") 
} catch let aError as Error { 
    // print and handle aError 
} 

Hoffe, es hilft Ihnen.

-1

Hier ist eine einfache String Erweiterung, die das Problem löst:

extension String { 
    func fixUnicode() -> String { 
     var copy = self as NSString 
     let regex = try! NSRegularExpression(pattern: "\\\\U([A-Z0-9]{4})", options: .caseInsensitive) 
     let matches = regex.matches(in: self, options: [], range: NSMakeRange(0, characters.count)).reversed() 
     matches.forEach { 
      let char = copy.substring(with: $0.rangeAt(1)) 
      copy = copy.replacingCharacters(in: $0.range, with: String(UnicodeScalar(Int(char, radix: 16)!)!)) as NSString 
     } 
     return copy as String 
    } 
}