Append items to dictionary

2019-08-30 06:38发布

This question does not solve my issue.

I aim at printing out a JSON valid formatted dictionary, but I wanted to add items to this dictionary over a for loop. The resulting JSON file should look like:

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

The below code works partially.

  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) 

If the directory has a file called test.md, the above returns:

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

However I want it to return:

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

So I can convert into valid JSON.

  • How can I add the returned entry from buildItem into items?

The entire code can be found in this pastebin.

标签: swift linux
2条回答
我只想做你的唯一
2楼-- · 2019-08-30 07:15

So the problem is that you are adding the result of buildItem to your dictionary as values for different keys instead of appending them to an array as the value for the items key.

Basically, what you want is items["items"] = [array of buildItem results].

So, you need to replace your for loop with

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

and then serialize the dictionary into data and convert it to string you can simply use this simple extension for dictionaries with string keys

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

    }

}

and then print your JSON

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

here is the entire code

查看更多
唯我独甜
3楼-- · 2019-08-30 07:17

You have to change items type to array because you can't take same keys for multiple values. In dictionary, every keys are distinct.

So just add more file names into filelist by append function of array.

查看更多
登录 后发表回答