You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:07:29