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

Swift 4中JSONEncoder无法编码遵循Codable的String/Int类型怎么办?

解决Swift 4中JSONEncoder无法直接编码String/Int的问题

这个问题其实是JSON语法规范的限制导致的——标准JSON要求顶层结构必须是对象({})或者数组([]),单个的字符串、数字这类基础类型并不属于合法的JSON顶层结构,所以JSONEncoder会直接抛出格式错误。

下面给你两种合规的解决思路:

1. 将单个值包装为数组

把String/Int放进数组里,这样顶层结构就是合法的JSON数组:

let encoder = JSONEncoder()
do {
    // 包装字符串到数组中
    let encodedData = try encoder.encode(["test string"])
    // 可以转成字符串查看结果
    if let jsonString = String(data: encodedData, encoding: .utf8) {
        print(jsonString) // 输出:["test string"]
    }
} catch let err {
    print(err.localizedDescription)
}

Int类型的处理完全一样,只需要把["test string"]换成[123]即可。

2. 将单个值包装为字典

给你的基础类型指定一个键,包装成JSON对象:

let encoder = JSONEncoder()
do {
    // 包装字符串到字典中,自定义key
    let encodedData = try encoder.encode(["content": "test string"])
    if let jsonString = String(data: encodedData, encoding: .utf8) {
        print(jsonString) // 输出:{"content":"test string"}
    }
} catch let err {
    print(err.localizedDescription)
}

特殊场景:如果确实需要单独输出基础类型的JSON(非标准)

如果你的业务场景允许使用非标准的JSON(比如某些服务端接受单个值),可以跳过JSONEncoder,直接把基础类型转成Data:

// 处理字符串
if let data = "test string".data(using: .utf8) {
    print(data)
}

// 处理Int
if let data = "\(123)".data(using: .utf8) {
    print(data)
}

内容的提问来源于stack exchange,提问作者HonQii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:01:07