Как обновить json в типе значения данных с помощью Swift

#json #swift

#json #swift

Вопрос:

Представьте, что у меня есть следующий json в Data формате

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

Как я могу изменить, скажем, первый элемент pets на "cat" , сохранив мою data переменную?

Ответ №1:

Сначала вам нужно 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(amp;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))
  

Комментарии:

1. Вам удалось очень быстро найти ответ на свой абсолютно законный вопрос

2. @mag_zbc да, я опубликовал этот вопрос, потому что я не нашел похожего вопроса на SO, и я подумал, что это может быть полезно для некоторых людей.

3. Было бы лучше, если бы update был Decoder / Encoder независимым. Даже если это просто для JSON* , может возникнуть необходимость использовать их с настройками, отличными от настроек по умолчанию.