Изменить значение JSON для ключа, который может быть вложен в Swift - PullRequest
0 голосов
/ 06 марта 2019

Я не знаю, есть ли более быстрый способ или функция, которая уже реализована для моей проблемы. У меня есть вложенный динамический JSON с уникальными ключами.

{
    "Key1": true,
    "Key2": false,
    "Key3": "just a string",
    "Key4": {
               "Key5": "just a string",
               "Key6": 51,
               "Key7": {
                           "Key8": "this value has to be changed"
                       }
            }
}

Есть ли какая-либо функция Swift или пакет, который мог бы так легко это сделать:

let updatedJSON = originalJSON.update(key: "Key8", with: "---")

Так что обновленный JSON будет таким же, только "Key8" будет обновлен. Примите во внимание, что я не знаю иерархию. Ключевые позиции JSON могут быть осторожны. Иногда Key8 может быть в корне объекта.

1 Ответ

1 голос
/ 06 марта 2019

Незнание структуры вашего JSON немного усложняет эту проблему, но она все еще может быть решена. У меня возникла идея рекурсивного поиска по словарю

extension Dictionary
{
    mutating func updateValueRecursively(forKey key : Key, newValue: Value) -> Bool
    {
        if keys.contains(key)
        {
            self[key] = newValue
            return true
        }
        for (_, value) in enumerated()
        {
            if var dict = value.value as? Dictionary<Key, Value> {
                if dict.updateValueRecursively(forKey: value.key, newValue: newValue), let newDict = dict as? Value {
                    self[value.key] = newDict
                    return true
                }
            }
        }
        return false
    }
}

Конечно, сначала вам нужно превратить строку JSON в словарь

var dict : Dictionary<String : Any>
if let data = jsonString.data(using: .utf8) {
do {
    dict=  try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
} catch {
    print(error.localizedDescription)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...