iOS 中的 Alamofire 正在接收字典而不是数组
Posted
技术标签:
【中文标题】iOS 中的 Alamofire 正在接收字典而不是数组【英文标题】:Alamofire in iOS is Receiving Dictionary Instead of Array 【发布时间】:2019-07-25 17:40:24 【问题描述】:我正在 ios 中创建表,并且应该以 JSON 数组的形式接收所需的数据。但是,当我在我的 iOS 应用程序中获取数据时,它会显示为未排序的字典。我能够在 Postman 中运行 GET 请求并正确接收数据,但是当我在我的 iOS 应用程序中通过 Alamofire 接收它时,它的格式不正确。 Alamofire 是否有可能以某种方式重新格式化 JSON 并将所有数组转换为字典,我可以以某种方式覆盖该设置吗?
以下是 Postman 中 JSON 的列部分的示例:
这是我通过 Alamofire 收到的内容:
这就是我尝试访问 JSON 的方式
if let jsonColumns = json["columns"] as? [[String:Any]]
for columns in jsonColumns
for column in columns.values
if let c = column as? [String:Any]
if c["isVisible"] as? Bool == false
continue
if let columnName = c["name"] as? String
dataSet.columns.append(columnName)
【问题讨论】:
是字典。列的值是数组。 我明白这一点,但是如果您查看第二张图片,列的值将作为字典而不是数组接收。 第二张图片中columns
的值也是[[String: Any]]
,只是数组用括号而不是方括号括起来。
如果还是数组,为什么会乱序呢?
显示解码 json 的代码
【参考方案1】:
两张图片中 JSON 的结构相同,columns
是一个字典数组 ([[String: Any]]
),只有一个元素。
字典上的值没有排序,因为它们是通过键而不是循环访问值来访问的。
来自here:
字典存储相同类型的键和 没有定义排序的集合中相同类型的值。每个 value 与唯一键相关联,该键充当标识符 字典中的那个值。与数组中的项不同,a 中的项 字典没有指定的顺序。当你使用字典时 您需要根据它们的标识符查找值,大致相同 使用现实世界词典查找定义的方式 一个特定的词。
【讨论】:
遍历内容不是问题。事实是我收到的 json 顺序不正确。 您使用了错误的数据结构。如果您需要对对象进行某种排序,则应使用数组而不是字典。 json 对象与 swift 字典的访问策略相同。 换句话说,根据定义,使用字典/json 对象没有“正确的顺序”。 @LorenzOliveto 是对的......我建立了一个基本的游乐场,您可以检查以重现您的问题:pastebin.com/S4pNmUgJ 如果您运行 3 次,您很可能会得到差异结果。这是因为字典是如何工作的。【参考方案2】:Alamofire ObjectMapper 按字母顺序排列参数。
您可以将 JSON 更改为列数组,如下所示:
"columns" : [
"name": "1", "visible": false,
"name": "2", "visible": false,
"name": "3", "visible": true
]
这种方式可以解决排序问题。
【讨论】:
以上是关于iOS 中的 Alamofire 正在接收字典而不是数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AlamoFire/ObjectMapper 访问嵌入在 JSON 字典中的链接?
使用 Alamofire 解析字典中的 json 对象 [关闭]