2017-08-09 89 views
-1
{ 
    "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

回答

0

這真是糟糕的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。)