过滤 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":为此,您可以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!字符串 @hamedabedini 如果您是工作表或集合,那么 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 数据并打印的主要内容,如果未能解决你的问题,请参考以下文章