Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift在使用JSONECODER转换为JSON时保持秩序_Json_Swift_Codable - Fatal编程技术网

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
。我需要它只包含URLRequest
httpBody
的订单,但在接收数据时不包含订单。由于
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中的字符串。