Ios 将数组编码为json时密钥顺序问题

Ios 将数组编码为json时密钥顺序问题,ios,swift,encoding,jsonencoder,Ios,Swift,Encoding,Jsonencoder,您好,我正在将数组编码为json,这样我就创建了如下的模型类 class QuotationListDataModel: Codable{ var quatation_id: String? var PartNumber: String? var Description: String? var Quantity: String? var AvailableStockQty: String? var Each: String? init(q

您好,我正在将
数组编码为
json
,这样我就创建了如下的模型类

class QuotationListDataModel: Codable{
    var quatation_id: String?
    var PartNumber: String?
    var Description: String?
    var Quantity: String?
    var AvailableStockQty: String?
    var Each: String?
    init(quatation_id: String?, PartNumber: String?,Description: String?,Quantity:String?,AvailableStockQty: String?,Each: String?) {
        self.quatation_id = quatation_id
        self.PartNumber = PartNumber
        self.Description = Description
        self.Quantity = Quantity
        self.AvailableStockQty = AvailableStockQty
        self.Each = Each
    }

}
  let encoder = JSONEncoder()
  encoder.outputFormatting = .prettyPrinted
  do {
       let jsonData = try encoder.encode(quotationSeelctedData)
       if let jsonString = String.init(data: jsonData, encoding: .utf8) {
             print(jsonString)
       }
  } catch {
      print("the encoding failed")
  }
[
  {
    "quatation_id": "67",
    "Description": "PSH BTN",
    "Each": "140.00 Total 40320.00",
    "PartNumber": "15",
    "Quantity": "288",
    "AvailableStockQty": "0"
  },
  {
    "quatation_id": "66",
    "Description": "SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)",
    "Each": "14.00 Total 3612.00",
    "PartNumber": "000015-40",
    "Quantity": "258",
    "AvailableStockQty": "10"
  }
]
Part Number : 000015-40

Description : SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)

Quantity : 10

Available Stock Qty. : 10

Each: 12.1 Total: 121
我正在编码的代码如下所示

class QuotationListDataModel: Codable{
    var quatation_id: String?
    var PartNumber: String?
    var Description: String?
    var Quantity: String?
    var AvailableStockQty: String?
    var Each: String?
    init(quatation_id: String?, PartNumber: String?,Description: String?,Quantity:String?,AvailableStockQty: String?,Each: String?) {
        self.quatation_id = quatation_id
        self.PartNumber = PartNumber
        self.Description = Description
        self.Quantity = Quantity
        self.AvailableStockQty = AvailableStockQty
        self.Each = Each
    }

}
  let encoder = JSONEncoder()
  encoder.outputFormatting = .prettyPrinted
  do {
       let jsonData = try encoder.encode(quotationSeelctedData)
       if let jsonString = String.init(data: jsonData, encoding: .utf8) {
             print(jsonString)
       }
  } catch {
      print("the encoding failed")
  }
[
  {
    "quatation_id": "67",
    "Description": "PSH BTN",
    "Each": "140.00 Total 40320.00",
    "PartNumber": "15",
    "Quantity": "288",
    "AvailableStockQty": "0"
  },
  {
    "quatation_id": "66",
    "Description": "SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)",
    "Each": "14.00 Total 3612.00",
    "PartNumber": "000015-40",
    "Quantity": "258",
    "AvailableStockQty": "10"
  }
]
Part Number : 000015-40

Description : SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)

Quantity : 10

Available Stock Qty. : 10

Each: 12.1 Total: 121
这段代码成功地进行了json编码,但当我打印编码的字符串时,顺序没有得到维护,然后我得到如下输出

class QuotationListDataModel: Codable{
    var quatation_id: String?
    var PartNumber: String?
    var Description: String?
    var Quantity: String?
    var AvailableStockQty: String?
    var Each: String?
    init(quatation_id: String?, PartNumber: String?,Description: String?,Quantity:String?,AvailableStockQty: String?,Each: String?) {
        self.quatation_id = quatation_id
        self.PartNumber = PartNumber
        self.Description = Description
        self.Quantity = Quantity
        self.AvailableStockQty = AvailableStockQty
        self.Each = Each
    }

}
  let encoder = JSONEncoder()
  encoder.outputFormatting = .prettyPrinted
  do {
       let jsonData = try encoder.encode(quotationSeelctedData)
       if let jsonString = String.init(data: jsonData, encoding: .utf8) {
             print(jsonString)
       }
  } catch {
      print("the encoding failed")
  }
[
  {
    "quatation_id": "67",
    "Description": "PSH BTN",
    "Each": "140.00 Total 40320.00",
    "PartNumber": "15",
    "Quantity": "288",
    "AvailableStockQty": "0"
  },
  {
    "quatation_id": "66",
    "Description": "SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)",
    "Each": "14.00 Total 3612.00",
    "PartNumber": "000015-40",
    "Quantity": "258",
    "AvailableStockQty": "10"
  }
]
Part Number : 000015-40

Description : SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)

Quantity : 10

Available Stock Qty. : 10

Each: 12.1 Total: 121
我希望输出如下

class QuotationListDataModel: Codable{
    var quatation_id: String?
    var PartNumber: String?
    var Description: String?
    var Quantity: String?
    var AvailableStockQty: String?
    var Each: String?
    init(quatation_id: String?, PartNumber: String?,Description: String?,Quantity:String?,AvailableStockQty: String?,Each: String?) {
        self.quatation_id = quatation_id
        self.PartNumber = PartNumber
        self.Description = Description
        self.Quantity = Quantity
        self.AvailableStockQty = AvailableStockQty
        self.Each = Each
    }

}
  let encoder = JSONEncoder()
  encoder.outputFormatting = .prettyPrinted
  do {
       let jsonData = try encoder.encode(quotationSeelctedData)
       if let jsonString = String.init(data: jsonData, encoding: .utf8) {
             print(jsonString)
       }
  } catch {
      print("the encoding failed")
  }
[
  {
    "quatation_id": "67",
    "Description": "PSH BTN",
    "Each": "140.00 Total 40320.00",
    "PartNumber": "15",
    "Quantity": "288",
    "AvailableStockQty": "0"
  },
  {
    "quatation_id": "66",
    "Description": "SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)",
    "Each": "14.00 Total 3612.00",
    "PartNumber": "000015-40",
    "Quantity": "258",
    "AvailableStockQty": "10"
  }
]
Part Number : 000015-40

Description : SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)

Quantity : 10

Available Stock Qty. : 10

Each: 12.1 Total: 121

有谁能告诉我如何按照我的模型类保持顺序吗?我猜,根据上面的评论,你实际上不想订购字典的键,你希望打印版本的顺序如下:

Part Number : 000015-40
Description : SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)
Quantity : 10
Available Stock Qty. : 10
Each: 12.1 Total: 121
所以,我想正确的答案是打印如下:

Part Number : 000015-40
Description : SELF-CLOSING 4-ARM HANDLE (PLATED BRASS)
Quantity : 10
Available Stock Qty. : 10
Each: 12.1 Total: 121
首先,创建包装器

struct FailableDecodable:Decodable{
让基地:基地?
init(来自解码器:解码器)抛出{
let container=尝试解码器。singleValueContainer()
self.base=try?container.decode(base.self)
}
}
let items=try JSONDecoder()
.decode([FailableDecodable].self,from:json)
.compactMap{$0.base}/.Swift 4.0中的.flatMap
}
}抓住{
打印(“编码失败”)
}
打印(项目)
如果你想按你的意愿打印它们

用于项目中的项目{

print(“Part Number:\(item.PartNumber!)”//试试这个,encoder.outputFormatting=.sortedKeys,看看发生了什么我已经试过了,但仍然顺序错误字典没有顺序。你不应该关心顺序,它是一个键访问,而不是索引访问。所以如果是因为“Part Number”不是“第一个”表面上看,这是正常的行为。那么还有其他解决方案吗?我能知道你为什么要订购吗?我想你能得到的唯一订单是alpha.订单。