Swift在使用JSONECODER转换为JSON时保持秩序
如何将Swift在使用JSONECODER转换为JSON时保持秩序,json,swift,codable,Json,Swift,Codable,如何将可编码结构转换为JSON数据对象并保持结构变量的顺序?我知道Dictionary没有排序,而且jsonecoder和JSONSerialization.data只接受Dictionary或Array。我需要它只包含URLRequesthttpBody的订单,但在接收数据时不包含订单。由于httpBody是数据对象,也许我可以避免使用jsonecoder并直接将struct转换为数据对象 struct RequestBody: Codable { let paramB: String
可编码结构
转换为JSON数据
对象并保持结构变量的顺序?我知道Dictionary
没有排序,而且jsonecoder
和JSONSerialization.data
只接受Dictionary
或Array
。我需要它只包含URLRequesthttpBody
的订单,但在接收数据时不包含订单。由于httpBody
是数据对象,也许我可以避免使用jsonecoder
并直接将struct转换为数据对象
struct RequestBody: Codable {
let paramB: String
let paramC: String
let paramA: String
}
目前,我找到的唯一方法是手动将其转换为JSON字符串:
func toString() -> String {
return """
{"paramB":paramB,"paramC":\(paramC),"paramA":\(paramA)}
"""
}
请参见JSON对象按定义具有未定义的顺序。如果顺序很重要,则必须更改API。您可以在技术上实现自己版本的JSONECODER,但这并不简单。您的想法完全正确。您可以从头开始创建JSONEncoder,也可以只将字节写入输出流。您的需求违反了JSON的语义,但您肯定可以从头开始构建它。这是一项重大任务,没有简单的“这就是你如何做的”。你最好编写一个自定义字符串格式化程序来处理你的精确(非标准)字符串特定数据类型的格式要求。编码时唯一的选项是
outputFormatting=.sortedKeys
,这是解决问题的最简单方法。如果您没有许多需要特定顺序的结构。我只需返回Data
而不是String
,并将其作为计算属性var Data:Data{.init(“{paramB”:\(paramB),“paramC”:\(paramC),“paramA”:\(paramA)}“.utf8)}
对于复杂的数据结构,我可能会使用一些特殊的键,例如键01
,键02
,然后使用outputFormatting=.sortedKeys
,然后将键替换为最终JSON中的字符串。