2017-08-09 7 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")**、どのようにすばやく3で可能ですか? responseData-> index[1]->comedy[]-> "isFavourit" null to 1のみを更新してください。すぐに辞書の値を更新する3

このような辞書の値を設定することができます responseData[1][Comedy]![0]["isFavourit"] = 1 swift3で動作していません。

「isFavourit」の値は1に設定できますか?

私はちょうど任意の型を表す不変式に代入することはできませんコードショーのエラーの上

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

のようなものを試してみましたか?

+0

あなたがしようとしているものをいくつかのコードを表示してください? – 3stud1ant3

+0

スタックオーバーフローを検索しようとしましたか?このようなJSONデータの管理については何も見つかりませんか? – matt

+0

カテゴリをカスタムオブジェクト(構造体またはクラス)にマップすることを検討し、名前 'isFavourit'は 'Int'ではなくBoolであることを意味します。 – vadian

答えて

0

これは本当に悪いJSONです。問題は、配列responseDataの辞書に一貫性のあるキーがないことです。最初は、キー

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

を持っているが、第2キー

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

を持っているこれは、あなたがcategoryNameキーの値を引き抜いてきたまでは2番目のキーの名前を知らないことを意味します。あなたが進める前に、それをやめなければならないでしょう。

したがって、jsonという文字列に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全体を解析することは単なるコード行です!

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

そして、あなたがアクセスしようとしている値は非常に単純に表現できる:

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

だから私がしなければならないすべてはvarにすべての私のletを作るあるあなたのJSONがjsonという変数であると想定しあなたがしようとしているように、彼らはすべて設定可能です。

(このソリューションの詳細については、Swift 4 Decodable with keys not known until decoding timeを参照してください。)

関連する問題