首页 > 解决方案 > Swift:如何从 json 动态创建字典?

问题描述

我想听听你的一些建议。我想dictionary从 API 的动态响应获取中创建一个并在AlamofirePOST 请求中发送该字典。

从我目前的情况来看,它正在工作,但我对我所做的并不满意,我认为代码真的很乱。

这是我可以收到的示例

"content": {
    "type": "form",
    "fields": [
        {
            "type": "select",
            "label": "Do you have your documents?",
            "field": "user.has_docs",
            "default": 0,
            "choices": [
                {
                    "value": 0,
                    "name": "Not yet"
                },
                {
                    "value": 1,
                    "name": "I do"
                }
            ]
        },
        {
            "type": "input",
            "field": "user.date",
            "label": "When do you arrive?",
        }
   ]
}

使用协议解析 json 后Codable,我的所有数据都在模型中Field

Choice

所以我想创建我的字典,我想要以下方案:

{
  "value": {
    "user": {
      "has_docs": 1,
      "date": "29/07/2020"
    }
  }
}

名为 : "value" 的键始终是相同的值,但另一个取决于 API 的结果。“父对象”对应字段的前缀,右边是子对象。

在 Swift 中硬编码字典并不难,我会的

let dict = [
    "value": [
        "user": [
            "has_docs": 1,
            "date": "29/07/2020"
        ]
    ]
]

但是麻烦从尝试动态创建字典开始。user内部的值仅保留最后一个值,并将has_docs替换为date

我找到了一种使用的解决方法flatmapreduce但它只允许类型 [String: String],不幸的是我也需要在字典中写入 [String: Int]。

这是代码示例

let flattenedDictionary = [key : dictionaries
   .flatMap { $0 }
   .reduce([String:String]()) { (dict, tuple) in
       var nextDict = dict
       nextDict.updateValue(tuple.1 as! String, forKey: tuple.0)
       return nextDict
   }]
parameters["value"] = flattenedDictionary

这里:键=“用户”。字典 = [[“has_docs”:1],[“日期”:“2020 年 7 月 29 日”]]

如果您需要更多信息,请随时交换

如果您对如何帮助我有任何线索,我将不胜感激,感谢您到目前为止的阅读。

我希望我很容易理解。

编辑

从总体上看:我想动态创建字典 [String: [String: [String: Any]]]

标签: jsonswiftdictionaryoptimizationalamofire

解决方案


如果你有一个[String: [String: [String: Any]]][String: [String: Any]]字典有点不清楚,但动态创建它的概念会非常相似。

var user: [String: Any] = [:]
user["has_docs"] = 1
user["date"] = Date()

let dict = ["value": user]

推荐阅读