【问题标题】:Append items to dictionary将项目附加到字典
【发布时间】:2017-09-30 12:28:53
【问题描述】:

This 问题没有解决我的问题。

我的目标是打印出一个 JSON 有效的格式化字典,但我想通过 for 循环将项目添加到该字典中。生成的 JSON 文件应如下所示:

"{
 "items": [{
   "name":"An Item"
   },{
     "name":"Item 2"
   }]
}" 

以下代码部分工作。

  func buildItem(name: String) -> [String:Any] {
    let action : [String: Any] = [
          "name": name
    ]
    return action
  }

  var items : [String: Any] = [:]
  for filename in filelist {
  items[filename] = buildItem(name: filename)
  }
  print (items) 

如果目录有一个名为test.md的文件,上面的返回:

["test.md": ["name": "test.md"]]

但是我希望它返回:

["items": ["name": "test.md"], ["name": "file2.md"]]

所以我可以转换成有效的 JSON。

  • 如何将 buildItem 返回的条目添加到items

完整的代码可以在这个pastebin找到。

【问题讨论】:

  • 你想向这个字典中添加项目,还是你想要一个字典数组?
  • 很难理解你想要达到的目标。你能分享一下预期的 JSON 结果吗?

标签: swift linux


【解决方案1】:

所以问题在于您将buildItem 的结果作为不同键的值添加到字典中,而不是将它们作为items 键的值附加到数组中。

基本上,你想要的是items["items"] = [array of buildItem results]

因此,您需要将 for 循环替换为

var items : [String: Any] = [:]
items["items"] = filelist.map { buildItem(name: $0) }

然后将字典序列化为数据并将其转换为字符串,您可以简单地将这个简单的扩展用于带有字符串键的字典

extension Dictionary where Key == String {

    func toPrettyJSON() throws -> String {

        let jsonData = try JSONSerialization.data(withJSONObject: self, 
                                             options: [.prettyPrinted])
        guard let jsonStr = String(data: jsonData, encoding: .ascii)
            else { throw NSError.init() }
        return jsonStr

    }

}

然后打印你的 JSON

if let jsonStr = try? items.toPrettyJSON() {
   print(jsonStr)
}

here 是整个代码

【讨论】:

    【解决方案2】:

    您必须将项目类型更改为数组,因为您不能为多个值使用相同的键。在字典中,每个键都是不同的。

    所以只需通过数组的 append 函数将更多的文件名添加到文件列表中。

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 2023-02-24
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多