【问题标题】:Alamofire 4 and special characters in JSONAlamofire 4 和 JSON 中的特殊字符
【发布时间】:2017-02-03 14:36:22
【问题描述】:

我在使用 Alamofire 4 时遇到了特殊字符的问题。
JSON 包含 æ、ø 和 å,浏览器显示它们很好,我之前使用 SwiftyJSON 的解决方案也是如此。

Alamofire 4显示类似这样的内容:

U00e6

使用这个调用:

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

如何解决这个问题?

【问题讨论】:

  • 您确定您的 json 已正确编码为 utf8 吗?
  • 是的,因为浏览器和我之前使用 SwiftyJSON 的解决方案都可以正常显示。
  • @Recusiwe 检查我的答案。

标签: ios json swift alamofire


【解决方案1】:

编辑:

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
            }
    }

我在 json 响应中添加了 æ 并尝试打印的问题。

输出:

JSON:  Optional(<__NSArrayI 0x600000050320>(
{
    "email_address" = "testwts06@gmail.com";
     username = "testwts06 \U00e6";
},
{
    "email_address" = "testwts01@gmail.com";
    username = "testwts01 \U00eb";
},
{
    "email_address" = "testwts100@gmail.com";
    username = testwts100;
})

在显示时以正确的格式显示。

【讨论】:

  • 我似乎找不到上述成员?我的 specificURL 只是一个字符串。
  • 当我将编码设置为 JSONEncoding 时,它不会在 Alamofire.request(specificURL, method: .get, parameters: param, encoding: JSONEncoding.default).responseJSON { response in print(response.result) } } 中打印任何内容我已经在浏览器中检查了 url,一切都很好。
  • 尝试使用 responseString 而不是 responseJSON。
  • 是的,在浏览器中一切正常。
  • 添加响应图片。
【解决方案2】:

似乎是由于错误的 JSON 编码导致的典型序列化错误,可能您的响应状态码是 3840。

JSON 文本应以 UTF-8、UTF-16 或 UTF-32 编码。

您可以尝试将响应数据转换为正确的 UTF8 编码:

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 
}

希望对你有帮助。

【讨论】:

    【解决方案3】:

    Swift 3 更新 Ekta 的答案:

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

    【讨论】:

      【解决方案4】:

      这里有一个简单的String 扩展来解决这个问题:

      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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        相关资源
        最近更新 更多