Swift 4 JSONEncoder 中的字典键顺序



是否可以将 Swift JSON 编码器配置为使用结构属性的排序顺序作为 JSON 输出中字典键的排序顺序?默认情况下,它使用一些任意(但看似不是随机(的顺序,例如......

struct Example: Codable {
let id: Int
let name: String
let createdAt: Date
let comments: [String]
}

。结果...

"example" : {
"id" : 1,
"name" : "Test",
"comments" : [
"Comment 1",
"Comment 2"
],
"createdAt" : 549539643.25327206
}

我知道顺序在语义上无关紧要,但我想保留它以进行调试。

JSONEncoder具有outputFormatting属性,您可以这样做,

let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys

我没有尝试过,请尝试让我知道。

目前这是不可能的,但有一个开放的请求 JSONEncoder 应该允许为此自定义键排序行为。

我遇到了一个问题,即我无法控制的服务要求字段按特定顺序排列 - 这是一个小请求,所以我最终预先格式化了 json 并使用插值插入值。

我想出的最好的(希望是临时的(解决方案是使用 CodingKeys 使用按字典顺序排列的前缀指定编码键,然后使用编辑器删除前缀。

例如,我的结构开始:

struct Creature : Codable 
let name : String
let size : SizeType
let type : String
var cr : String?
var level : Int?
let source : String?
let page : Int?
...

然后,我将编码密钥枚举指定为:

private enum CodingKeys : String, CodingKey {
case name = "00name", size = "01size", type = "02type",
cr = "03cr",level = "04level",
source = "05source", page = "06source",
templates, alignment, ac, hp, speeds,

并使用".prettyprinted"和".sortedKeysJSONEncoder.OutputFormatting"选项生成此 JSON(示例(:

{ "00名称": "废除", "01尺寸": "L", "02类型": "像差", "03cr": "10", "05来源": "MM", "06来源": 13, "能力":[{ "名称": "str", "值":21 }, { "名称": "dex", "值":9 }, { "名称": "con", "值":15 }, { "名称": "int", "值":18 }, { "名称": "WIS", "值":15 }, { "名称": "茶", "值":18 } ], "AC":{ "AC": 17,

现在我可以使用编辑器轻松删除"00"、"01"等。是的,这是一个黑客,但实现了我现在想要的。我想人们也可以编写一个外部(或内部(JSON 重写器,并且会想象那里存在这样的内容吗?

问题是关于配置合成编码器...只是澄清可以通过实现encode(to encoder: Encoder)来获得固定顺序:

struct Example: Codable {
let id: Int
let name: String
let createdAt: Date
let comments: [String]
}
extension Example {
enum CodingKeys: String, CodingKey {
case id
case name
case createdAt
case comments
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(name, forKey: .name)
try container.encode(createdAt, forKey: .createdAt)
try container.encode(comments, forKey: .comments)
}
}

相关内容

  • 没有找到相关文章

最新更新