在SwiftyJson中过滤数据

时间:2018-02-22 10:54:41

标签: ios json swift nspredicate swifty-json

我有一个SwiftyJson对象。

我无法过滤该数组。我试过这个解决方案https://stackoverflow.com/a/37497170/4831567。但是我的json格式不同,这就是为什么不工作。

[
    {
        "name": "19860",
        "header": {
            "start_time": "1519270200",
            "end_time": "1519299000",
            "state": "lunch"
        },
        "alerts": "1",
        "venue": {
            "location": "Delhi, India",
            "timezone": "+05:30"
        },
        "srs_category": [
            0,
            1
        ]
    },
    {
        "name": "19861",
        "header": {
            "start_time": "1519270200",
            "end_time": "1519299000",
            "state": "Dinner"
        },
        "alerts": "1",
        "venue": {
            "location": "Mumbai, India",
            "timezone": "+05:30"
        },
        "srs_category": [
            1,
            3
        ]
    },
    {
        "name": "19862",
        "header": {
            "start_time": "1519270200",
            "end_time": "1519299000",
            "state": "lunch"
        },
        "alerts": "1",
        "venue": {
            "location": "Surat, India",
            "timezone": "+05:30"
        },
        "srs_category": [
            0,
            2
        ]
    }
]

我想找到srs_category包含的对象1.我知道循环和条件是可能的。但我希望通过NSPredicate。如果有可能请帮助我。

谢谢。

2 个答案:

答案 0 :(得分:2)

以下是使用SwiftyJSON的简便方法:

    let filtered = JSON(yourArray).arrayValue.filter({
        $0["srs_category"].arrayValue.map({ $0.intValue }).contains(1)
    })

答案 1 :(得分:1)

使用Swift原生函数而不是NSPredicate

data代表从某个地方收到的Data个对象

do {
    if let json = try JSONSerialization.jsonObject(with:data) as? [[String:Any]] {
        let srsCategory1 = json.first(where: { dict -> Bool in
            guard let array = dict["srs_category"] as? [Int] else { return false }
            return array.contains(1)
        })
        print(srsCategory1 ?? "not found")
    }
} catch {
    print(error)
}

如果有多个项目可以匹配条件,请将first替换为filter。然后结果是一个非可选的数组。