Swift 5生成字体嵌套JSON字符串及JSONSerialization相关疑问
Swift 5生成字体家族嵌套JSON字符串问题解决
问题情况
你需要在Swift 5里生成已安装字体家族及其对应字体的嵌套JSON字符串,用来传给WebView,但现在代码跑起来输出的是字节数据,不是你要的JSON格式文本,同时也搞不清Swift嵌套对象和JSONSerialization的要求。
原代码:
var obj: [String: Any] = [:] for family in UIFont.familyNames { var fonts: [String] = [] for font in UIFont.fontNames(forFamilyName: family) { fonts.append(font) } obj[family] = fonts } do { let json = try JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted) print(json) // 输出‘9415 bytes’而非目标JSON字符串 } catch {}
期望的JSON格式:
{ "Didot": ["Didot","Didot-Italic","Didot-Bold"], "Impact": ["Impact"], // 其他字体家族... }
解决步骤
1. 明确:你的对象结构完全合规
你构建的[String: [String]]字典嵌套数组的结构,完全符合JSONSerialization的要求。它支持的合法类型包括字符串、数字、布尔值、数组、字典(键必须是String)、nil,所以不用纠结结构问题。
2. 核心操作:把Data转换成JSON字符串
JSONSerialization.data(withJSONObject:)返回的是二进制Data类型,直接打印只会显示字节数。你需要将这个Data转换为UTF-8编码的字符串,才能得到可读的JSON文本。
修改后的代码:
var obj: [String: [String]] = [:] // 直接指定具体类型,代码更清晰 for family in UIFont.familyNames { // 无需手动循环添加,直接获取字体名数组 let fonts = UIFont.fontNames(forFamilyName: family) obj[family] = fonts } do { let jsonData = try JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted) // 将二进制Data转为UTF-8格式的JSON字符串 if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) // 此处可将jsonString传递给WebView使用 } } catch { // 增加错误打印,方便排查转换失败原因 print("JSON转换出错:\(error.localizedDescription)") }
额外优化说明
- 简化了原代码中手动循环添加字体的逻辑,直接使用
UIFont.fontNames(forFamilyName:)的返回值,代码更简洁 - 给字典指定了具体类型
[String: [String]],比[String: Any]更清晰,避免潜在类型问题 - 补充了错误捕获的打印,便于定位转换失败的问题
内容的提问来源于stack exchange,提问作者Josiah
相关产品推荐
相关产品推荐

