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

