在json中查找与id参数匹配的对象

时间:2016-11-13 07:51:27

标签: ios objective-c json

我有一个包含混合物的json 2种对象modelA和modelB

modelA有一个包含两者混合的数组。 但是modelB是单项。

modelA和modelB都有一个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":[…]
    }
   ]
}

modelA有id和items。

modelB只是id。

items是modelA和modelB的数组。

并且每个id都是唯一的。

感谢。

1 个答案:

答案 0 :(得分: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