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

将原始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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 06:06:45