Swift:如何从 json 动态创建字典?

Posted

技术标签:

【中文标题】Swift:如何从 json 动态创建字典?【英文标题】:Swift : How to create a dictionary dynamically from a json? 【发布时间】:2020-07-21 22:27:43 【问题描述】:

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

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

这是我可以收到的示例

"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?",
        
   ]

使用Codable协议解析json后,我的所有数据都在模型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], ["date": "29/07/2020"]]

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

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

我希望我很容易理解。

编辑

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

【问题讨论】:

我不知道第一个 JSON 和 Field 模型与第二个 value/user/has_docs JSON 的关系如何...你能澄清一下两者的关系吗相关? 当然,Field 是我从第一个 JSON 中解析出来的,它允许我使用这些值。关于第二个 JSON,这就是我将在 Alamofire 请求中发送的内容。所以,value 键永远不会改变。因为第一个 JSON 有一个 field 键,所以我得到了前缀,这就是我有 userfield 后缀 (has_docs) 在 user 内的方式。这就是它的关系, 我明白了。所以问题根本不在于第一个 JSON。您只想根据某些东西动态地创建字典(对于这个问题而言,那是什么东西无关紧要),对吗?这个字典应该是[String: [String: [String: Any]]]吗? 没错!让我编辑帖子 那么,创建它有什么问题? (实际上,是[String: String: [String:Any]]] 还是少一级:[String: [String: Any]],正如您的静态代码所暗示的那样) 【参考方案1】:

有点不清楚您是否有 [String: [String: [String: Any]]][String: [String: Any]] 字典,但动态创建它的概念会非常相似。

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

let dict = ["value": user]

【讨论】:

为了解决我的问题,我刚刚从 [String: [String: [String: Any]]] 传递到 [String: [String: Any]]。第一个删除了我嵌套字典的所有值。谢谢,它帮助我重构了我的代码。

以上是关于Swift:如何从 json 动态创建字典?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 4 中的字典创建 JSON?

如何在 Swift 中使用动态键(在根级别)解码此 JSON?

如何动态创建控件并在swift 4中动态对齐?

如何使用 Swift Codable 处理部分动态 JSON?

如何从 JSON 动态创建 Bootstrap 表

如何在 swift 2.0 中提取 JSON 数据以在 UITableView 中动态应用?