swift更新字典值3

问题描述:

{ 
    "error": false, 
    "error_msg": "Get trending data.", 
    "Total_category": 2, 
    "responseData": [ 
    { 
     "categoryName": "Trending", 
     "Trending": [ 
     { 
      "category": "Trending", 
      "trailerPrice": "", 
      "isFavourit": null, 
      "isWatchlist": null 
     } 
     ] 
    }, 
    { 
     "categoryName": "Comedy", 
     "Comedy": [ 
     { 
      "category": "Comedy", 
      "trailerPrice": "", 
      "isFavourit": null, 
      "isWatchlist": null 
     } 
     ] 
    } 

    ] 
} 

我需要为特定的密钥更新内容**("isFavourit")**,请问swift 3中怎么可能?只更新responseData-> index[1]->comedy[]-> "isFavourit" null to 1swift更新字典值3

我可以像这样设置字典的值 responseData[1][Comedy]![0]["isFavourit"] = 1不能在swift3中工作。

如何设置“isFavourit”值1?

我只是试图像

(arrVideoDetail[1]["comedy"] as! [Dictionary<String,Any>])[0]["isFavourit"] = 1 

上面的代码显示错误不能分配给类型为“任何一成不变的表情?

+0

请出示一些代码,你试过吗? – 3stud1ant3

+0

你尝试过搜索Stack Overflow吗?你找不到有关管理这类JSON数据的任何事情? – matt

+0

考虑将类别映射到自定义对象(结构或类),名称“isFavourit”意味着“Bool”而不是“Int”。 – vadian

这真是糟糕的JSON。问题是responseData阵列中的字典没有一致的密钥。第一个具有键

"categoryName": "Trending", 
    "Trending": [ 

但第二个具有关键

"categoryName": "Comedy", 
    "Comedy": [ 

这意味着,你不知道第二项的名称,直到你拉出categoryName键的值。所以你必须停下来,然后才能继续下去。

所以,让我们假设你有一个叫做json的字符串。然后:

let d1 = try! JSONSerialization.jsonObject(with: json.data(using: .utf8)!) 
    let a1 = (d1 as! [String:Any])["responseData"] 
    let d2 = (a1 as! [[String:Any]])[1] 
    let key = d2["categoryName"] as! String // "Comedy" 
    let a2 = d2[key]! 
    var d3 = (a2 as! [[String:Any]])[0] 
    // ["isWatchlist": <null>, "trailerPrice": , "isFavourit": <null>, "category": Comedy] 


现在d3是你正在寻找的内部字典,您可以根据需要修改它。


顺便说一句,这是你的JSON是为什么这一切会是如此好得多斯威夫特4.我们可以将整个JSON解析成一个自定义结构的性能的很好的例子:

struct MyJson : Decodable { 
    let error : Bool 
    let error_msg : String 
    let Total_category : Int 
    let responseData : [ResponseData] 
    struct ResponseData : Codable { 
     let categoryName : String 
     let unknown : [Inner] 
     struct Inner : Codable { 
      let category : String 
      let trailerPrice : String 
      let isFavourit : String? 
      let isWatchList : String? 
     } 
     private struct CK : CodingKey { 
      var stringValue: String 
      init?(stringValue: String) { self.stringValue = stringValue } 
      var intValue: Int? 
      init?(intValue: Int) { return nil } 
     } 
     init(from decoder: Decoder) throws { 
      let con = try! decoder.container(keyedBy: CK.self) 
      self.categoryName = try! con.decode(String.self, forKey:CK(stringValue:"categoryName")!) 
      let key = self.categoryName 
      self.unknown = try! con.decode([Inner].self, forKey: CK(stringValue:key)!) 
     } 
    } 
} 


配置我们的结构后,解析整个JSON只是一行代码!假设你的JSON是在一个名为json变量:

let myjson = try JSONDecoder().decode(MyJson.self, from: json.data(using: .utf8)!) 

而且你要访问的值是表达得很干脆:

let fav = myjson.responseData[1].unknown[0].isFavourit 

因此,所有我需要做的就是让我所有的letvar现在它们都是可以设定的,就像你试图做的那样。

(想了解更多的解决方案,请参阅Swift 4 Decodable with keys not known until decoding time。)