如何通过API调用

时间:2018-12-10 20:17:51

标签: json swift codable

调用此特定的API时,其中一个变量会根据结果更改。

示例:

{
    "map": {
        "1945206": {
            "installBaseNUMB": 0,
            "serialNumber": "KB1",
            ...
        }
    }
}

1945206将更改为另一个数字,我不知道如何正确解码。

我的可编码结构如下:

struct Map: Codable {
    let the1945206: The1945206?

    enum CodingKeys: String, CodingKey {
        case the1945206 = "1945206"
    }
}

struct The1945206: Codable {
    let installBaseNUMB: Int?
    let serialNumber, woStatus: String?
    let workOrderNumber: Int?
    let woNotes: [String]?
    let woParts: [WoPart]?
}

如果1945206更改为另一个值,它将中断并且不会显示任何结果。如何在解码数据时使用动态变量?

3 个答案:

答案 0 :(得分:1)

您可以尝试

struct Root : Codable {
   let map: [String:The1945206]
}

let res = try? JSONDecoder().decode(Root.self,from:data)
print(res?.map.values)

{
    "map": {
        "1945204": {
            "installBaseNUMB": 0,
            "serialNumber": "KB1",
            ...
        },
        "1945205": {
            "installBaseNUMB": 0,
            "serialNumber": "KB1",
            ...
        },
        "1945206": {
            "installBaseNUMB": 0,
            "serialNumber": "KB1",
            ...
        }
    }
}

答案 1 :(得分:0)

由于可读性较差,我建议设置与The1945206不同的名称。我将改用MapElement。如果您知道map仅具有一个元素,并且不想检查与该值关联的键,则可以使用计算属性var value:MapElement?来获取它。它返回一个可选的,因为let map:[String:MapElement]字典可以为空。

let json = """
{
    "map": {
        "1945206": {
            "installBaseNUMB": 0,
            "serialNumber": "KB1"
        }
    }
}
""".data(using: .utf8)!

struct Container: Codable {
    let map:[String:MapElement]

    var value:MapElement? {
        return map.values.first
    }
}

struct MapElement: Codable {
    let installBaseNUMB: Int
    let serialNumber: String
}

let res = try? JSONDecoder().decode(Container.self,from:json)
print(res?.value as Any)

更新:

如果要使用多个MapElement,可以将var value:MapElement更改为var values:[MapElement],如下所示:

struct Container: Codable {
    let map:[String:MapElement]

    var values:[MapElement] {
        return map.values
    }
}

但是请记住,您将数据存储为字典,因此不能保证元素的顺序。

答案 2 :(得分:0)

尝试一下:

struct Install: Decodable {
    let installBaseNUMB: Int, serialNumber: String
}

let installData = try? JSONDecoder().decode([String:[String:Install]].self, from: jsonData2!)
let install = installData?.values.first?.values.first