Swift 无法解析的json中unicode的问题(\u)
使用Foundation的JSONSerialization
解析带有unicode的json 字符串时,报错如下:
Printing description of error:
Error Domain=NSCocoaErrorDomain Code=3840 "Unexpected end of file during string parse (expected low-surrogate code point but did not find one)." UserInfo={NSDebugDescription=Unexpected end of file during string parse (expected low-surrogate code point but did not find one).}
解析出错的json如下:
{
"zhid": null,
"orderTime": "4小时前",
"nickName": "仙***\uDF19",
"userAvatar": "http://auth2.xunbaotianxing.com/authimg/avatar/2202222685.png",
"orderNum": 191159,
"orderDesc": "【新鲜水果】【黄金瓜】 x1.0份 ¥17.55份(1个/份,约2-2.5斤)\n【新鲜水果】【红颜草莓】 x4.0份 ¥16.0份(400g/份)\n【新鲜水果】【小台芒】 x2.0份 ¥7.8份(1斤/份)\n【新鲜水果】【沃柑散装】 x3.0份 ¥7.5份(1斤/份)"
}
仙***\uDF19
这段文本中有unicode 编码,无法正常解析,
解决方案:
CFStringTransform 可以解决转换unicode 编码, 其可以在拉丁语和阿拉伯语、西里尔语、希腊语、韩语(韩国)、希伯来语、日语(平假名和片假名)、普通话、泰语之间来回转写。
通过其进行转换
func unicodeString(_ str: String) -> String {
let mutableStr = NSMutableString(string: str) as CFMutableString
CFStringTransform(mutableStr, nil, "Any-Hex/Java" as CFString, true)
return mutableStr as String
}
将json 字符串 通过CoreFoundation中的CFStringTransform
转码,然再通过JSONSerialization
解析:
func test() {
do {
let data = try Data.init(contentsOf: URL(fileURLWithPath: "jsontest.json"), options: .alwaysMapped)
if let str = String(data: data, encoding: .utf8), let data = str.data(using: .utf8)
{
do {
let obj = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
print(obj)
} catch {
print("error")
}
}
} catch {
print("error")
}
}
或者使用swift标准库的String
的方法:
@available(OSX 10.11, iOS 9.0, *)
public func applyingTransform(_ transform: StringTransform, reverse: Bool) -> String?
解析:
func test() {
do {
let data = try Data.init(contentsOf: URL(fileURLWithPath: "jsontest.json"), options: .alwaysMapped)
if let str = String(data: data, encoding: .utf8)
{
guard let transformStr = str.applyingTransform(StringTransform(rawValue: "Any-Hex/Java"), reverse: true) else {
return
}
let data = transformStr.data(using: .utf8)
do {
let obj = try JSONSerialization.jsonObject(with: data!, options: .fragmentsAllowed)
print(obj)
} catch {
print("error")
}
}
} catch {
print("error")
}
}
网友评论