выдает порядок ключей при кодировании массива в json - PullRequest
0 голосов
/ 27 сентября 2019

Здравствуйте, я encoding массив в 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")
  }

и сэтот код json успешно закодирован, но порядок не поддерживается, когда я печатаю закодированную строку, тогда я получаю вывод, как показано ниже

[
  {
    "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

может кто-нибудь сказать мнекак поддерживать порядок согласно моей модели класса

1 Ответ

0 голосов
/ 28 сентября 2019

Полагаю, согласно приведенному выше комментарию, вы на самом деле не хотите заказывать ключи словаря, вы хотите, чтобы печатная версия была упорядочена следующим образом:

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<Base : Decodable> : Decodable {

    let base: Base?

    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        self.base = try? container.decode(Base.self)
    }
}

let items = try JSONDecoder()
    .decode([FailableDecodable<QuotationListDataModel>].self, from: json)
    .compactMap { $0.base } // .flatMap in Swift 4.0

       }
  } catch {
      print("the encoding failed")
  }

print(items)

, если вы хотите напечатать их как хотите

for item in items {
    print("Part Number : \(item.PartNumber!)" // << you should     handle it if it's nill, so use if let ...
    print("Description : \(item.Description!)"
    print("Quantity : \(item.Quantity!)"
    print("Available Stock Qty. : \(item.AvailableStockQty!)"
    print("Each: \(item.Each!) Total: \(item.AvailableStockQty! * item.Each!)"
}

Предложение

Я предлагаю вам следовать быстрому коду стандартам и защищать свои функции с помощью защитного программирования - также в ваших классах никогда не используйте дополнительные переменныедля необходимой (важной) информации.

источник:

https://stackoverflow.com/a/46369152/1388852

...