#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*
, может возникнуть необходимость использовать их с настройками, отличными от настроек по умолчанию.