如何更新"任何"类型对象中的值

Sym*_*mon 1 ios swift

我有一个很大的json数据.我试图描述下面的场景 - >

JSON = {

"str1": 1,

"str2": false,

"response":

  {
    "str1": 10.2,

    "lists": [{
        "list": ["a", "b", "c"],
        "something": 1
    }, {
        "list": ["a1", "b1", "c1"],
        "something": 2
    }]

  }

}
Run Code Online (Sandbox Code Playgroud)

我从服务器获取这个json为[String:Any]

var jsonData: Any?

func firstInitialiseJsonData(jsonData: Any?) { // Initialize jsonData by server json
     self.jsonData = jsonData
}
Run Code Online (Sandbox Code Playgroud)

现在我想更新这个self.jsonData.

func updateJsonData() {
     guard let newJsonData = self.jsonData as? [String : Any] else { return }
     guard let response = newJsonData["response"] as? [String : Any] else { return }
     guard var lists = response["lists"] as? [[String : Any]] else { return }

     lists.append(["list": ["a2","b2","c2"], "something" : 3])

}
Run Code Online (Sandbox Code Playgroud)

但上面的代码不起作用,因为"列表"包含复制数据.我怎样才能更新self.jsonData?任何帮助

vad*_*ian 5

在值类型环境中,您必须重新分配变异对象.使用原始集合类型时,这非常麻烦.

使用自定义结构,Decodable它更方便(和更有效)

此示例省略了所有不相关的密钥

let json = """
{
    "str1": 1,
    "str2": false,
    "response": {
        "str1": 10.2,
        "lists": [{
            "list": ["a", "b", "c"],
            "something": 1
        }, {
            "list": ["a1", "b1", "c1"],
            "something": 2
        }]
    }
}
"""

struct Root : Decodable {
    var response : Response
}

struct Response : Decodable {
    var lists : [List]
}

struct List : Decodable {
    let list : [String]
    let something : Int
}
Run Code Online (Sandbox Code Playgroud)
let data = Data(json.utf8)

do {
    // decode the JSON to the `Root` struct, `var` makes the object mutable
    var jsonData = try JSONDecoder().decode(Root.self, from: data)
    // create a new `List`
    let newList = List(list: ["a2","b2","c2"], something: 3)
    // assign the value back to the top level object
    jsonData.response.lists.append(newList)

    print(jsonData)

} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)