【问题标题】:Filtering JSON based on the value of a nested string根据嵌套字符串的值过滤 JSON
【发布时间】:2026-01-29 16:40:01
【问题描述】:

使用如下 JSON 对象,是否可以仅过滤 IOS 相关内容?我对任何方法都持开放态度,例如 for-in 循环或 .filter?

例如,我想进行过滤,以便仅当平台密钥与“IOS”匹配时才返回内容,在这种情况下,我会得到:

  • 标题 1
  • 问题 1b
  • IOS

困难在于只有在平台匹配成功的情况下才应该打印标题,而且我看不到使用常规嵌套 for in 循环实现此目的的方法。

[
  {
    "title": "Title 1",
    "faqs": [
      {
        "question": "question 1a",
        "platform": "ANDROID"
      },
      {
        "question": "question 1b",
        "platform": "IOS"
      }
    ]
  },
  {
    "title": "Title 2",
    "faqs": [
      {
        "question": "question 2a",
        "platform": "ANDROID"
      },
      {
        "question": "question 2b",
        "platform": "WEB"
      }
    ]
  }
]

【问题讨论】:

    标签: json swift filter


    【解决方案1】:

    简单(Swift 3)解决方案,data 是 JSON 字符串,如 Data

      do {
        if let jsonObject = try JSONSerialization.jsonObject(with:data, options: []) as? [[String:Any]] {
          for item in jsonObject {
            if let title = item["title"] as? String,
               let faqs = item["faqs"] as? [[String:String]],
               let iOSFaqs = faqs.filter({$0["platform"] == "IOS"}).first {
                 print(title)
                 print(iOSFaqs)
            }
          }
        }
      } catch let error as NSError {
        print(error)
      }
    

    【讨论】:

    • 谢谢。我喜欢这个解决方案,但不幸的是我们还不能更新到 Swift 3。抱歉,我应该明确说明这一点。
    • 在 Swift 2 中,try NSJSONSerialization.JSONObjectWithData(data, options: []) 仅有一点变化,您可以省略可选绑定链中的第二个和第三个let
    【解决方案2】:

    您可以使用 NSPredicate 过滤字典数组。 您可以参考这些较早的问题作为示例。这不完全是“纯粹的快速方式”,但可以完成工作。代码在 Objective C 中,但可以很容易地翻译成 Swift 语法。如果您需要帮助,我可以稍后扩展答案。 Link 1 Link 2

    【讨论】: