如何在没有unicode转义序列的情况下获得JSON响应Swift



我正在尝试以正确的形式获取数据,下面是我的请求示例:

var request = URLRequest(url: url)
request.httpMethod = "GET"
request.allHTTPHeaderFields = [
"Content-Type": "http",
"Authorization": token
]        
let session = URLSession.shared
session.dataTask(with: request) { data, response, error in
guard let data = data else {
completion(.failure(.invalidData))
return
}
do {
if let string = String(data: data, encoding: .utf8) { print(string) }
let json = try JSONSerialization.jsonObject(with: data, options: [])
print(json)
completion(.failure(.invalidURL))
}
catch {
completion(.failure(.decodingProblem))
}
}.resume()

在那个请求之后,我总是得到像下一个一样的JSON结果。但我想在没有unicode序列的情况下获得正确的文本

{
"result": {
"id": 2,
"write_date": "2021-10-05T08:46:53.945082",
"name": "u041eu0432u0430u0434u0447u0443u043a",
"x_phone": "+380999999999",
"number_policy": "u0422u0435u0441u0442",
"client_email": "test@it.com.ua",
"x_sk_phone1": "+380999999999",
"x_manager1": "u041cu0435u043du0435u0434u0436u0435u0440 1",
"x_u_phone": "45454544",
"x_u_email": "app@it.com.ua",
"x_u_phone_man1": "123456789",
"x_street": "u0456u0432u0441u044cu043au0430, 29",
"x_street2": "u043bu0456u0432u0441u044cu043au0438u0439u00bb, 5 u044du0442u0430u0436",
"x_city": "u041au0438u0457u0432",
"x_com_street": "\u043eu0447u0438u0446u044cu043au0430,44",
"x_ost_zab": "u0422u0430u043a",
"x_zab_v_obos": "u0422u0430u043a",
"x_zab_v_rem": "u041du0456",
"x_travma": "u0422u0430u043a",
"x_sd_1": "100%",
"x_sd_2": "u0422u0430u043a",
"x_sd_3": "u0422u0430u043a",
"x_sp_1": "u0422u0430u043a, u0432 u043cu0435u0436u0430u0445 u043bu0456u043cu0456u0442u0443",
"x_dop_1": "u0422u0430u043a",
"x_info": "u0422u0435u0441u0442u043eu0432u0438u0439 u0437u0430u043fu0438u0441 u0434u043bu044f u0432u0456u0434u043eu0431u0440u0430u0436u0435u043du043du044f u0443 u043fu0440u043eu0433u0440u0430u043cu043cu0456 u043au043bu0456u0435u043du0442u0430 u0432 u043cu043eu0431u0456u043bu044cu043du043eu043cu0443 u0434u043eu0434u0430u0442u043au0443",
"x_limit_1": "300 000",
"x_limit_other": "Some"
}
}

所以我想得到没有unicode序列的正确文本。

您的JSON字符串存在一些问题。当使用\U时,它应该发送4个字节(8个十六进制字符(,但它只发送2个字节(4个六进制字符(。如果您可以控制返回的内容,最简单的解决方案是返回\u而不是\u,这是2字节的正确unicode转义,否则您将不得不进行一些字符串操作,并在解码json:之前应用字符串转换

let jsonData = Data(#"{"x_city":"U041aU0438U0457U0432"}"#.utf8)
let jsonString = String(data: jsonData, encoding: .utf8) ?? ""
let cleanedData = Data(
jsonString
.replacingOccurrences(of: #"U"#, with: #"u"#)
.applyingTransform(.init("Hex-Any"), reverse: false)!
.utf8
)
struct Response: Codable {
let xCity: String
}
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let response = try decoder.decode(Response.self, from: cleanedData)

print(response)  // Response(xCity: "Київ")
} catch {
print(error)
}

相关内容

最新更新