Swift如何将嵌套JSON全层级转字典并正确显示日文字符
Swift JSON转换问题解决方案
问题1:获取places字段对应的字典数组
你可以通过可选绑定安全转换places字段的类型,避免强制类型转换导致的崩溃,示例代码如下:
let response: String = "{\"places\":[{\"name\":\"東京\",\"date\":\"2005/03/02\",\"transport\":\"新幹線\"},{\"name\":\"北海道\",\"date\":\"2006/04/06\",\"transport\":\"飛行機\"}],\"no_of_person\":\"4\",\"package_name\":\"日本最高\"}" guard let jsonObj = response.data(using: .utf8) else { print("字符串转Data失败") return } do { guard let items = try JSONSerialization.jsonObject(with: jsonObj, options: []) as? [String: Any] else { print("JSON根节点不是字典类型") return } // 核心转换代码:把places字段转为字典数组 guard let places = items["places"] as? [[String: Any]] else { print("places字段不是字典数组类型") return } // 验证结果:places已经是可以直接使用的字典数组 for place in places { if let name = place["name"] as? String, let date = place["date"] as? String, let transport = place["transport"] as? String { print("地点:\(name),日期:\(date),交通:\(transport)") } } } catch { print("JSON解析失败:\(error)") }
问题2:解决嵌套层级日文字符显示为Unicode转义的问题
你遇到的转义问题是打印逻辑导致的,不是数据本身有问题:
- 直接打印
String类型的package_name时,系统直接输出字符串原始值,所以日文显示正常 - 直接打印嵌套的
NSArray/NSDictionary类型时,系统调用的是Objective-C对应的description方法,会自动把非ASCII字符转为Unicode转义序列,但实际存储的日文是正确的,业务取值使用不受影响
如果需要打印完整JSON结构时显示正常日文,可以把解析后的字典重新序列化为格式化JSON字符串再打印,示例代码如下:
do { let formattedData = try JSONSerialization.data(withJSONObject: items, options: [.prettyPrinted]) if let formattedStr = String(data: formattedData, encoding: .utf8) { print(formattedStr) } } catch { print("JSON格式化失败:\(error)") }
输出效果如下:
{ "no_of_person" : "4", "package_name" : "日本最高", "places" : [ { "name" : "東京", "date" : "2005/03/02", "transport" : "新幹線" }, { "name" : "北海道", "date" : "2006/04/06", "transport" : "飛行機" } ] }
内容的提问来源于stack exchange,提问作者tarako
相关产品推荐
相关产品推荐

