过滤 JSON 数据并打印

Posted

技术标签:

【中文标题】过滤 JSON 数据并打印【英文标题】:Filtering JSON data and printing it 【发布时间】:2017-05-22 10:15:01 【问题描述】:

我在我的快速代码中成功parse JSON data,但我想打印具有特定值的那些。现在在代码 vc.packages 中打印所有内容,但我只想打印以下内容:

"typeCode" 为 FULL ,"validTo" 有值,"stateCode" 有效

我将如何在我的代码中检查并分别打印它?

func unzipPackage() 

    let vc = storyboard?.instantiateViewController(withIdentifier: "LoadingScreenController") as! LoadingScreenController

    let popup = STPopupController(rootViewController: vc)
    popup.style = .formSheet
    popup.hidesCloseButton = false
    popup.navigationBarHidden = true
    popup.backgroundView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
    popup.containerView.layer.cornerRadius = 4
    popup.present(in: self, completion: 

        DemosClient.sharedInstance.requestDataPackage()
            .then  response -> Void in

                vc.contentSizeInPopup = CGSize(width: 600, height: 800)
                vc.landscapeContentSizeInPopup = CGSize(width: 600, height: 800)


                vc.titles = (self.parseJSON(response: response))
                print(vc.titles)
                vc.packages = response["results"] as? [[String:Any]] ?? []


                print(vc.packages)

            
            .catch  error in

                print(error)
        

        vc.loadData()
        vc.startTimer()


    )

【问题讨论】:

"validTo" 有值吗? @NiravD 因为它不是空的。例如在 JSON 解析中:validTo": 有一个空值,"validTo": 2017-05-11T07:57:07Z 这个有一个值。 你想要这个字典数组中的 contentUrl 数组吗? 不不,想通了。我只是想将 contentUrl 的值用于我认为的另一个目的。我必须这样做:let rowPackageUrl = (packages[indexPath.row]["contentUrl"] as!String) 【参考方案1】:

为此,您可以filter 您的results 数组,然后将filter 的结果分配给packages

let results = response["results"] as? [[String:Any]] ?? []
vc.packages = results.filter 
    return ($0["typeCode"] as? String == "FULL") && 
           ($0["validTo"] != nil) && 
           ($0["stateCode"] as? String == "valid")

【讨论】:

我试过了,但是我收到了一个错误,索引超出了这一行的范围。 cell.textLabel?.text = packages[indexPath.row]["name"] as!字符串 cell.detailTextLabel?.text = packages[indexPath.row]["releaseNotes"] as!字符串 @hamedab​​edini 如果您是工作表或集合,那么 indexOutOfRange 是什么意思,请确保您返回的是数组计数而不是一些静态值 我修复了这个问题,但是当我运行代码时,它实际上并没有过滤它。 我相信您的代码是正确的,但我检查过,这不是问题所在。上面的代码不适用于我。我不确定可能是什么问题。它有错误。我在下面尝试了@David 的回答,它对我来说很好。 让它工作。更新了答案。非常感谢您的帮助。【参考方案2】:

您需要解析字典数组并检查键及其对应的值。这段代码应该可以解决问题。我还没有测试过,但应该可以正常工作。

vc.packages = response["results"] as? [[String:Any]] ?? []

let filteredPackages = [[String:Any]]()
for package in vc.packages 
    guard let typeCode = package["typeCode"] as? String, typeCode == "FULL" else  continue 
    guard let stateCode = package["stateCode"] as? String, stateCode == "valid" else continue
    guard let validTo = package["validTo"] as? String, validTo != "" else continue
    filteredPackages.append(package)


print(filteredPackage)

【讨论】:

谢谢大卫,它奏效了,感谢您的学习曲线。

以上是关于过滤 JSON 数据并打印的主要内容,如果未能解决你的问题,请参考以下文章

从websocket过滤json对象/值并打印到控制台日志

从 REST API 过滤 JSON 对象的疑问

如何过滤获取的数据并加载到 tableview 中?

如何快速过滤json对象?

子组件通过父组件过滤时如何保持状态?

如何按名称过滤键,然后使用 jq 访问嵌套对象