2

使用 Swift 4 的Encoder&Decoder协议以及JSONDecoder如何Codeable使用给定 JSON 中的键初始化类型结构。

即给定下面的JSON,我希望只用于results初始化Example

{
  "boolean": true,
  "number": 123,
  "results": {
    "a": "b",
    "c": "d",
    "e": "f"
  },
  "string": "Hello World"
}
struct Example: MDB, Codeable{
    var a: String
    var b: String
    var c: String
}
public static func initalize<T: Codable & MDBItem>(json: Data) -> [T]{
        var items = [T]()
        let decoder = JSONDecoder()
        do {
         //How do I initialize `T` using a key from the JSON given
          //ie. decoder.decode([T].self, from: json["results"])
          // Or decoder.decode(["results", [T].self, from: json)
            items = try decoder.decode([T].self, from: json)
                    } catch {
            print("error trying to convert data to JSON")
        }
        return items
    }
4

1 回答 1

2

一种可能的简单方法是创建包装结构。

所以,你有这个 JSON

let json = """
    {
    "boolean": true,
    "number": 123,
    "results": {
        "a": "b",
        "c": "d",
        "e": "f"
    },
    "string": "Hello World"
    }
    """

由于您只对"results"定义此结构的部分感兴趣

struct Example: Codable {
    let a: String
    let c: String
    let e: String
}

包装器

现在,为了利用Codable协议的力量(在 Swift 4 中可用),您可以创建一个像这样的包装器结构

struct Wrapper: Codable {
    let results: Example
}

Wrapper 结构的唯一目的是定义从原始 JSON 的根到您感兴趣的部分的路径。这是Codable协议将为您完成剩下的工作。

解码

现在您可以使用 Wrapper 结构轻松解码 JSON。

if
    let data = json.data(using: .utf8),
    let wrapper = try? JSONDecoder().decode(Wrapper.self, from: data) {

    let results = wrapper.results
    print(results)
}

results最后,您可以从包装器中提取属性。

于 2017-06-24T15:46:44.087 回答