使用JSON swift4中的密钥解码结构

时间:2017-06-24 01:51:43

标签: ios swift swift4

使用Swift 4' Encoder& Decoder协议和JSONDecoder如何使用给定JSON中的密钥初始化Codeable类型的结构。

即。鉴于下面的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
    }

1 个答案:

答案 0 :(得分: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协议将为您完成剩余的工作。< / p>

解码

现在您可以使用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属性。