2016-11-13 9 views
0

にidパラメータをマッチング見つける私は、オブジェクトの混合物2種類MODELAとmodelBオブジェクトはJSON

MODELAは、両方の混合物を含む配列を持っているが含まれているJSONを持っています。 ですが、modelBは単品です。

モデルAとモデルBの両方にidパラメータがあります。

idパラメータを使用してオブジェクト(modelAまたはmodelB)を検索し、オブジェクトを返す最も簡単で最速の方法は何ですか?

{ "id": 23, 
    "items":[ 
    { "name":"g", 
     "id":10 
    }, 
    { 
     "id":90 , 
     "items":[ 
      {"name":"a" , "id":11}, 
      {"name":"s" , "id":12}, 
      {"id":93 , items […]}, 
      {"name":"d" , "id":15}, 

     ] 
    }, 
    { 
     "id":92 , 
     "items":[…] 
    } 
    ] 
} 

モデルAにはidとアイテムがあります。

モデルBはIDだけです。

itemsは、modelAとmodelBの配列です。

各idは一意です。

ありがとうございました。

+0

JSON属性について詳しく説明できますか? – ELKA

答えて

0

JSONファイルを[String:AnyObject] swift辞書に解析したと仮定します。

方法1:
あなたは一度だけを検索しようとしている場合、あなたはこのコードを使用して階層を再帰的にすることができます

func findById(id: Int, json: [String: AnyObject]) -> [String: AnyObject]?{ 
    if let jsonId = json["id"] as? Int where jsonId == id{ 
     return json 
    } 
    if let jsonItems = json["items"] as? [[String: AnyObject]]{ 
     for jsonItem in jsonItems{ 
      if let item = findById(id, json: jsonItem){ 
       return item 
      } 
     } 
    } 
    return nil 
} 

方法2:

あなたがしている場合Idによって複数回検索すると、最初の方法は遅くなります。 JSONファイルをフラット化し、キーとしてIDを、JSONオブジェクト(モデルAまたはモデルB)を値として使用して辞書を構築する必要があります:

func flattenHierarchy(json: [String: AnyObject], inout flatObj: [Int: [String:AnyObject]]){ 
    if let jsonId = json["id"] as? Int { 
     flatObj[jsonId] = json 
    } 
    if let jsonItems = json["items"] as? [[String: AnyObject]]{ 
     for jsonItem in jsonItems{ 
      flattenHierarchy(jsonItem, flatObj: &flatObj) 
     } 
    } 
} 


var flatStructure = [Int: [String:AnyObject]]() 
flattenHierarchy(json, flatObj: &flatStructure) //jsonObj is you [String: AnyObject] json 

flatStructure[10] //will give you the result you want 
関連する問題