将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]//嘿,罗布,谢谢!我本以为答案是这样的,但我发誓我以前试过它时它不起作用。