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

Swift JSONEncoder如何让JSON键按指定顺序排列?

解决Swift中Encodable结构体编码JSON指定键顺序的问题

要让JSON编码后的键按你指定的顺序排列,需要自定义Encodable的编码逻辑,具体步骤如下:

1. 自定义CodingKeys枚举

先为结构体定义对应的CodingKeys枚举,确保每个属性都有匹配的case:

struct Req: Encodable {
    let SourceText: String
    let Target: String
    let Source: String
    let ProjectId: Int = 0
    
    // 自定义编码键枚举
    enum CodingKeys: String, CodingKey {
        case SourceText, Source, Target, ProjectId
    }
}

2. 重写encode(to:)方法

在结构体中实现encode(to:)方法,严格按你期望的顺序依次编码每个键值对:

struct Req: Encodable {
    let SourceText: String
    let Target: String
    let Source: String
    let ProjectId: Int = 0
    
    enum CodingKeys: String, CodingKey {
        case SourceText, Source, Target, ProjectId
    }
    
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        // 按指定顺序写入键值对
        try container.encode(SourceText, forKey: .SourceText)
        try container.encode(Source, forKey: .Source)
        try container.encode(Target, forKey: .Target)
        try container.encode(ProjectId, forKey: .ProjectId)
    }
}

3. 验证编码结果

使用JSONEncoder编码时,就能得到符合预期顺序的JSON:

let req = Req(SourceText: "你好", Target: "en", Source: "zh")
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // 可选,用于格式化输出
if let data = try? encoder.encode(req), let jsonString = String(data: data, encoding: .utf8) {
    print(jsonString)
}

输出结果:

{
  "SourceText" : "你好",
  "Source" : "zh",
  "Target" : "en",
  "ProjectId" : 0
}

原理说明:默认的Encodable实现依赖Swift字典的无序特性,编码后键的顺序无法保证;而自定义encode(to:)方法后,会严格按照编写顺序将键值对写入编码容器,从而固定JSON键的排列顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:50:23