SWIFT:遍历转换为字典的 JSON 对象

Posted

技术标签:

【中文标题】SWIFT:遍历转换为字典的 JSON 对象【英文标题】:SWIFT: Iterate through a JSON object that's convert to a dictionary 【发布时间】:2020-09-14 15:25:38 【问题描述】:

注意:已经提出了一些类似的问题。然而,它们都没有提供如何解决这个看似简单的任务。所以我希望它在这里得到一劳永逸的解决。我的问题: 我正在接收这个嵌套的 JSON 对象:

  print("type(of: JSON) \( type(of: JSON))") //__NSDictionaryI
  completion(true, nil, JSON as? [String: Any], nil)

如您所见,Alamofire 模块将其转换为字典。 我一直在尝试使用不同的方法(有些东西,我认为与 javascript 相比应该很简单)访问嵌套值几个小时,但我找不到一种可行的方法。 因此,除了高级值之外,我无法访问其他任何内容:

for (key,movieData) in moviesData!  // moviesData is the JSON dictionary object
    // Do some logic
   

那么有没有办法轻松操作/访问接收到的 JSON 数据?

【问题讨论】:

这能回答你的问题吗? Looping through JSON object in Swift 或者这个***.com/questions/24111627/… 停止使用字典,声明结构并使用Decodable 将字典解析为结构。在javascript中,对象和字典是一回事,其他语言就不一样了。 developer.apple.com/swift/blog/?id=37 此外,ios 项目不再需要 Alamofire。设置URLSession 并不比使用 Alamofire 更难。 【参考方案1】:

这远不是一个理想的解决方案,但它确实有效。所以这里是:

  for (key,movieData) in moviesData! 
            if let nestedDictionary = moviesData![key] as? [String: Any] 
                print("nestedDictionary: ",nestedDictionary) // logs the result part of the JSON object
                // Trying to access nested values
                for (key,value) in nestedDictionary 
                    print("nestedDictionary.key: ",key)
                    print("nestedDictionary.type(of:value): ",type(of:value) )
                    print("nestedDictionary.value: ",value)
                    // Testing if sections is an array of dictionaries
                    if let arrayOfDictionaries = nestedDictionary[key] as? [[String: Any]] 
                        print("nestedDictionary: ",nestedDictionary) // logs the result part of the JSON object
                        // Trying to access array items which are sections
                        for item in arrayOfDictionaries 
                            print("arrayOfDictionaries.item: ",item)
                        
                    
                
            
        

它基于here提到的提示:

if let dictionary = jsonWithObjectRoot as? [String: Any] 
    if let number = dictionary["someKey"] as? Double 
        // access individual value in dictionary
    

    for (key, value) in dictionary 
        // access all key / value pairs in dictionary
    

    if let nestedDictionary = dictionary["anotherKey"] as? [String: Any] 
        // access nested dictionary values by key
    

关键思想是检查json内部是否有嵌套字典或嵌套数组,然后进行相应的迭代。

【讨论】:

以上是关于SWIFT:遍历转换为字典的 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

将 SWIFT 字典替换为 JSON 对象

Swift下面字典(json)和模型的转换

JSON字典对象到Swift中的字符串

在 Swift 中将字典转换为 JSON

在 Swift 中将字典转换为 JSON

如何将 Swift 对象序列化或转换为 JSON?