Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
将JSON对象解码为Swift字典保留键_Json_Swift - Fatal编程技术网

将JSON对象解码为Swift字典保留键

将JSON对象解码为Swift字典保留键,json,swift,Json,Swift,使用此代码: import Foundation let jsonData = """ { "equipment": [ { "name": "BigBox", "origin": "Customer", "type_codes": [ "XCD", "QPR" ], "category": "Shipping", "product_counts": { "M":

使用此代码:

import Foundation

let jsonData = """
{
  "equipment": [
    {
      "name": "BigBox",
      "origin": "Customer",
      "type_codes": [
        "XCD",
        "QPR"
      ],
      "category": "Shipping",
      "product_counts": {
        "M": 1,
        "D": 2,
        "W": 1,
        "F": 1
      }
    },
    {
      "name": "LittleBox",
      "origin": "Manufacturer",
      "type_codes": [
        "XCD",
        "DDP"
      ],
      "category": "Storage",
      "product_counts": {
        "W": 3,
        "F": 2
      }
    }
  ]
}
""".data(using: .utf8)!

struct EquipmentListing: Codable {
    let equipment: [Equipment]

    enum CodingKeys: String, CodingKey {
        case equipment
    }
}

struct Equipment: Codable {
    let name: String
    let origin: String
    let typeCodes: [String]
    let category: String
    let productCounts: ProductCounts

    enum CodingKeys: String, CodingKey {
        case name
        case origin
        case typeCodes = "type_codes"
        case category
        case productCounts = "product_counts"
    }
}

struct ProductCounts: Codable {
    let m: Int?
    let d: Int?
    let w: Int?
    let f: Int?

    enum CodingKeys: String, CodingKey {
        case m = "M"
        case d = "D"
        case w = "W"
        case f = "F"
    }
}

let equipmentListing = try! JSONDecoder().decode(EquipmentListing.self, from: jsonData)
print( equipmentListing.equipment[0].productCounts.d )
这是可行的,但有一个缺点,即
productCounts
keyed对象被转换为具有硬编码成员的结构,但可能有几十种可能性,我不想在代码中把它们都列为选项。我希望能够解码我的源JSON,以便
productCounts
以字典而不是结构形式出现

基本上,我希望最后一行是:

print( equipmentListing.equipment[0].productCounts["D"] )
**如果可以将
productCounts
中的键从
D
更改为
Dishash
M
更改为
Mirrow
等,则可获得额外积分,因为源代码已解码,因此:

print( equipmentListing.equipment[0].productCounts["Dishwasher"] )

因为您希望从任意字符串映射到整数,所以正如您所建议的,这是一个字典。您可以去掉ProductCounts结构并使用
[String:Int]

struct Equipment: Codable {
    let name: String
    let origin: String
    let typeCodes: [String]
    let category: String
    let productCounts: [String: Int]  // <===

    enum CodingKeys: String, CodingKey {
        case name
        case origin
        case typeCodes = "type_codes"
        case category
        case productCounts = "product_counts"
    }
}

print( equipmentListing.equipment[0].productCounts["D"] )
// Optional(2)
struct设备:可编码{
let name:String
让原点:字符串
let typecode:[字符串]
let类别:字符串

let productCounts:[String:Int]//嘿,罗布,谢谢!我本以为答案是这样的,但我发誓我以前试过它时它不起作用。