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
相关产品推荐
相关产品推荐

