我有一个包含混合物的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都是唯一的。
感谢。
答案 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