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 的格式化字典

Alamofire 5 任何字典

如何使用 AlamoFire/ObjectMapper 访问嵌入在 JSON 字典中的链接?

使用 Alamofire 解析字典中的 json 对象 [关闭]

使用 PHP 在 Swift 5 中使用 Alamofire 接收图像上传

iOS9 - NSURLSession 无法解析响应但 AlamoFire 工作