将原始Data添加至JSONEncoder:实现嵌套JSON结构需求
解决方案:将Data中的JSON作为嵌套结构编码
要实现将contents字段中的JSON字节直接作为嵌套JSON结构编码,需要在自定义encode(to:)方法中先解析Data为JSON对象,再将其编码到对应字段中,而非直接编码Data或字符串。
修改后的完整代码:
import Foundation struct Payload: Encodable { let name: String let contents: Data enum CodingKeys: String, CodingKey { case name case contents } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(name, forKey: .name) // 将contents解析为JSON对象 let jsonObject = try JSONSerialization.jsonObject(with: contents) // 创建对应contents字段的子编码器 let contentsEncoder = container.superEncoder(forKey: .contents) // 将JSON对象写入子编码器,实现嵌套JSON结构 try JSONSerialization.writeJSONObject(jsonObject, to: contentsEncoder) } } let payload = Payload( name: "Hello", contents: Data([123, 34, 116, 101, 120, 116, 34, 58, 34, 67, 34, 125]) ) let encoder = JSONEncoder() let data = try encoder.encode(payload) let string = String(data: data, encoding: .utf8)! print(string) // 输出:{"name":"Hello","contents":{"text":"C"}}
关键说明:
- 原代码直接编码
Data时,JSONEncoder默认会将Data转为Base64字符串,导致输出不符合预期。 - 转为
String编码时,字符串会被JSON转义处理,成为带引号的嵌套字符串,而非JSON结构。 - 修改后的代码通过
JSONSerialization.jsonObject(with:)将Data解析为原生JSON对象,再通过superEncoder(forKey:)创建对应字段的子编码器,最后用JSONSerialization.writeJSONObject(_:to:)将JSON对象直接写入,实现了嵌套JSON结构的效果。
内容的提问来源于stack exchange,提问作者Volodymyr Bobyr
相关产品推荐
相关产品推荐

