将项目附加到字典

时间:2017-09-30 00:15:07

标签: swift linux

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中找到整个代码。

2 个答案:

答案 0 :(得分:2)

所以问题是你将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是整个代码

答案 1 :(得分:1)

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

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