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 对象的主要内容,如果未能解决你的问题,请参考以下文章