我有一个很大的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?任何帮助
在值类型环境中,您必须重新分配变异对象.使用原始集合类型时,这非常麻烦.
使用自定义结构,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)