如何识别 JSON 响应中的特定值

Posted

技术标签:

【中文标题】如何识别 JSON 响应中的特定值【英文标题】:How to identify specific values in JSON response 【发布时间】:2016-05-31 08:33:03 【问题描述】:

我想获得特定的 JSON 响应。例如,仅获取 id 为 25 和 26 的数组中的结果(即名称和分数)。swift 中是否有 WHERE 子句?如果有帮助,我正在使用 Alamofire 和 SwiftyJSON。

现在我的代码只是提取所有值,但我只想得到 id 为 25 和 26 的结果。这可能吗?

我的代码:

  Alamofire.request(.GET, endPoint).validate()
        .responseJSON  response in

  switch response.result 

  case .Success:
            if let value = response.result.value 
                let json = JSON(value)
                for (_,subJson):(String, JSON) in json 
                    if let date = subJson["start_date"].string
                        self.date = date
                    
                    if let building = subJson["building_name"].string
                        self.building = building
                    
                    if let jobId = subJson["schedule_job_id"].int 
                        self.jobIdArray.append(jobId)
                    
                    if let tasks = subJson["tasks"].array
                        for building in tasks 
                            Tasks.sharedInstance.datas = tasks
                            if let ratings = building["safety_ratings"].array
                                for submission in ratings 
                                    if let score = submission["score"].string 
                                        self.scoreArray.append(score)
                                    
                                    if let ratingId = submission["safety_rating_id"].int 
                                        self.ratingArray.append(ratingId)
                                    
                                    if let submissionId = submission["submission_id"].int 
                                        self.subIdArray.append(submissionId)
                                    
                                
                            
                        
                    
                
                onCompletion()
            
 case .Failure(let error):
        print("Request failed with error: \(error)")
        onError?(error)
    
  

更新

    func getTask(onCompletion: () -> (), onError: ((NSError) -> ())? = nil) 

    guard let endPoint = Data.sharedInstance.weeklyEndpoint  else  print("Empty endpoint"); return 

    Alamofire.request(.GET, endPoint, encoding: .JSON)
        .validate()
        .responseJSON  response in

        switch response.result 

        case .Success:
            if let value = response.result.value 
                let json = JSON(value)
                for (_,subJson):(String, JSON) in json 
                    if let date = subJson["start_date"].string
                        self.date = date
                    
                    if let building = subJson["building_name"].string
                        self.building = building
                    
                    if let jobId = subJson["schedule_job_id"].int 
                        self.ratingArray.append(jobId)
                    

                    let IDsYouWant: [Int] = [18, 27]

                    let tasksYouWant = subJson["tasks"].arrayValue.filter IDsYouWant.contains($0["id"].intValue)

                    for task in tasksYouWant 

                        if let ratings = task["safety_ratings"].array
                            for submission in ratings 

                                if let score = submission["score"].string 
                                    let scoreResult = Int(score)
                                    self.ratingArray.append(scoreResult!)
                                

                                if let ratingId = submission["safety_rating_id"].int 
                                    self.ratingArray.append(ratingId)
                                

                                if let submissionId = submission["submission_id"].int 
                                    self.ratingArray.append(submissionId)
                                

                            
                        
                    

                    if let tasks = subJson["tasks"].array
                            Tasks.sharedInstance.datas = tasks
                    
                

                print(self.ratingArray)
                onCompletion()
            

        case .Failure(let error):
            print("Request failed with error: \(error)")
            onError?(error)
        
          

当我打印 taskYouWant 时,我得到一个空数组..

这是来自我的 GET https://codeshare.io/UqJMV 的 JSON 响应

我正在寻找的是scoresafety_rating_id,其中我的submission_id 是x 值。比如拉取submission_id为27的数组。

【问题讨论】:

不使用 JSON,不,但是一旦你将它解析为 Objective-C 集合类,你就有一些选择...... 能否请您包含您的 JSON 的实际 sn-p?您粘贴的那个无效。谢谢。 嗨 @EricD 我已经用 JSON 响应更新了我的帖子 【参考方案1】:

如何将 subJson["tasks"] 转换为数组然后对其进行过滤:

let IDsYouWant: [Int] = [25, 26]
let tasksYouWant = subJson["tasks"].arrayValue.filter IDsYouWant.contains($0["id"].intValue)

for task in tasksYouWant 
    //process task 25 and 26

希望有帮助!

【讨论】:

嗨@66o 我得到一个空数组..你能帮帮我吗? (更新代码) 您要解析哪个 JSON?您在代码共享中粘贴的那个看起来不同,您需要将键更新为适当的值以使其工作 对我试图在代码共享中解析 JSON 的困惑表示歉意,我也更新了我的值。我只对提交 id 为 27 的数组感兴趣(我的 JSON 给了我几个数组,我更新了我的代码共享以反映这一点) 好的,再次,在您的代码共享中,您有不一致的对象。前几个有“submission_id”作为int:"submission_id" : 26你标记的你感兴趣的是字符串"submission_id" : "27"如果id是一个字符串那么你需要把字符串放在IDsYouWant和过滤器关闭应该读@ 987654325@ 我仍然收到nil 我认为问题是脚本无法读取submission_id

以上是关于如何识别 JSON 响应中的特定值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JMeter 的 json 响应中的长 html 内容中提取特定的 *token* 值

比较 JSON 值并识别差异 -Snowflake SQL

opencv 如何检测特定形状的物体

JSON Web 令牌 - 如何识别用户?

如何识别和标记特定列中的重复数据

如何在ios中的特定collectionview单元格上应用手势识别器