如何使用Swift更新数据值类型中的json

时间:2019-03-06 10:31:56

标签: json swift

想象一下,我有一个Data格式的json

var data = Data("""
{
    "name": "Steve",
    "age": 30,
    "pets": [
        "dog"
    ]
}
""".utf8)

如何在保持pets变量不变的情况下,将"cat"的第一个元素更改为data

1 个答案:

答案 0 :(得分:2)

首先,您需要struct符合Codable与您的json匹配

struct Person: Codable {
    var name: String
    var age: Int
    var pets: [String]
}

然后,您可以使用这种通用方法,该方法采用Data类型的对象,对其进行解码并更改它,以便稍后在changeBlock闭包中声明。然后将其编码回去

extension Data {
    mutating func update<T: Codable>(changeBlock: (inout T) -> Void) throws {
        var decoded = try JSONDecoder().decode(T.self, from: self)
        changeBlock(&decoded)
        self = try JSONEncoder().encode(decoded)
    }
}

用法:

do {
    try data.update { (person: inout Person) -> Void in
        person.pets[0] = "cat"
    }
} catch { print(error) }

//print(String(data: data, encoding: .utf8))