2016-12-29 13 views
1

このjsonファイル "321"、日付 "654"、および "123"の出席者値を " @attributes "になります。私はレベルをフィルタリングすることができましたが、3以上のレベルで値にアクセスするより効率的な方法があるのだろうかと思いました。または、csharpのlinqに似たライブラリがあります。3つ以上のレベルからjsonデータを素早く最新のバージョンに取得する方法

"GameData"にジャンプしてすべてのGameDataを取得し、オブジェクトのリストに格納することはできますか?

json["level1"].["level2"].["level3"] 

JSON::

か、単にチェーンなど

{ 
    "Feed":{ 
     "Doc":{ 
      "Comp": { 
      }, 
      "GameData": {     
       "GameInfo": { 
        "Attendance": 321, 
         "Date": 654, 
         "ID": 00 
       } 
      },  
      "GameData": {     
       "GameInfo": { 
        "Attendance": 321, 
        "Date": 654 
        "ID": 01 
       }   
      } 
     }, 
     "@attributes": { 
      "Number": 123 
     } 
    } 
} 

コード:

let json = try JSONSerialization.jsonObject(with: data!,  options: .mutableContainers) as! [String: AnyObject] 
if let articlesFromJson = json["Feed"] as? [String: AnyObject]{ 
    print("level1") 
     if let aFromJson = articlesFromJson["Doc"] as? [String: AnyObject]{ 
      print("level2") 
       if let aFromJson = articlesFromJson["GameData"] as? [String: AnyObject]{ 
        print(aFromJson) 

     } 
    } 
} 
+0

あなたのJSONは奇妙である:1)の後に不足しているブラケットがあります最初の 'GameData' 2)それは同じのための2つのエントリを持ってしても意味がありません。キー 'GameData':最初のものが上書きされます3)文字列ではなく数値になるように見えるので' '' '' 321 "' => '321'を使います – Guig

+0

はい私はそれを知っていますユニークなIDのために同じ名前の2つを持つのは理にかなっていないのですか?私と一緒に練習しているjsonは編集可能ではありません。数字は文字列ではありません。私はjsonを再作成し、ビット – user3558639

+0

jsonで同じキーを2回書くとすぐに、最初のものは上書きされません。複数のアイテムを保持したい場合は、配列を使用する必要があります: '{" Doc ":{"ゲームデータ ":[{" ID ":1、...}、{" ID ":1、...}]}}' – Guig

答えて

1

あなたが行うことができます私は本当にSwiftyJsonのような:

import SwiftyJSON 
let json = JSON(data: data) 
let game = json["Feed"]["Doc"]["GameData"] // this is of type JSON 

let attendance = game["GameInfo"]["Attendance"].string ... 

let number = json["Feed"]["@attributes"]["Number"].string // this is of type String? 
let number = json["Feed"]["@attributes"]["Number"].stringValue // this is of type String, and will crash if the value is missing 

=== EDIT:重複したタグの情報===

JSON自体はそうすることからあなたを防ぐことはできません:https://stackoverflow.com/a/21833017/2054629います大部分のlibrairiesはJSONを辞書や配列として理解しており、それらの構造では重複したキーを持つことはできません。ブラウザコンソールでテストすることができますJavaScriptで例えば

JSON.stringify(JSON.parse('{"a": 1, "a": 2}')) === '{"a": 2}' 

と私はSwiftyJsonが同様に振る舞うと信じています。だから私はあなたにあなたのJSONの構造を変更することをお勧めしたい:

{ 
    "Feed":{ 
     "Doc":{ 
      "Comp": {}, 
      "GameData": {     
       "GamesInfo": [ 
        { 
         "Attendance": 321, 
         "Date": 654, 
         "ID": 0 
        }, 
        { 
         "Attendance": 321, 
         "Date": 654 
         "ID": 1 
        } 
       ] 
      }, 
     }, 
     "@attributes": { 
      "Number": 123 
     } 
    } 
} 
+0

はうまくいきます...しかし、離れている場合は、私はそれを回避したい – user3558639

+0

私の編集を参照してください重複したキー – Guig

0

ループ配列を通してあなたが必要なオブジェクトのループになるまで。その後、必要に応じてその値をキャストします。

関連する問題