【问题标题】:How to cast JSONSerialization result to an [[String:Any]] data structure?如何将 JSONSerialization 结果转换为 [[String:Any]] 数据结构?
【发布时间】:2021-09-21 16:31:25
【问题描述】:

对于我的问题我已经准备好了a simple Playground at Github:

使用代码将字符串解析为 JSON 可以正常工作:

import UIKit

var str =
"""
{"data": [{"uid":9844,"elo":2900,"motto":null,"given":"Ольга","avg_time":"04:13","avg_score":20.5},{"uid":13480,"elo":2875,"motto":null,"given":"Наталья","avg_time":"03:27","avg_score":21.0},{"uid":14376,"elo":2825,"motto":null,"given":"Дмитрий","avg_time":"04:51","avg_score":19.8},{"uid":8458,"elo":2734,"motto":null,"given":"Аля","avg_time":"03:03","avg_score":21.1},{"uid":18384,"elo":2723,"motto":null,"given":"Светлана","avg_time":"02:25","avg_score":19.6},{"uid":18125,"elo":2720,"motto":null,"given":"Людмила","avg_time":"03:57","avg_score":20.2},{"uid":14382,"elo":2708,"motto":null,"given":"Виктория","avg_time":"03:33","avg_score":19.1},{"uid":8380,"elo":2687,"motto":null,"given":"Ihor","avg_time":"01:44","avg_score":18.8},{"uid":15917,"elo":2681,"motto":null,"given":"Наталья","avg_time":"04:53","avg_score":20.1},{"uid":19650,"elo":2673,"motto":"Ты не проиграл, пока не сдался.","given":"Елена","avg_time":"01:46","avg_score":18.0},{"uid":13797,"elo":2653,"motto":null,"given":"Irina","avg_time":"03:27","avg_score":19.5},{"uid":13014,"elo":2648,"motto":null,"given":"Светлана","avg_time":"05:32","avg_score":21.6},{"uid":18811,"elo":2634,"motto":null,"given":"Алеся","avg_time":"03:45","avg_score":19.1},{"uid":13455,"elo":2630,"motto":null,"given":"Татьяна","avg_time":"02:43","avg_score":18.1},{"uid":16783,"elo":2614,"motto":null,"given":"Татьяна","avg_time":"02:28","avg_score":18.3}]}
"""

guard let data = str.data(using: .utf8),
      let json = try? JSONSerialization.jsonObject(with: data, options: [])
    else { fatalError("Error") }
print(json)

但是如何获取“data”属性引用的对象列表并将其转换为[[String:Any]] 数据结构?

我在以后的NSBatchInsertRequest 通话中需要它。

我尝试过print(json["data"] as? [[String:Any]])let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String:[[String:Any]]],但出现语法错误:

【问题讨论】:

  • 不相关,但您可以通过编写 let data = Data(str.utf8) 来摆脱 fatalError——顺便说一句,这永远不会发生。

标签: ios json swift


【解决方案1】:

这里

print(json["data"] as? [[String:Any]])

您可以为 json 下标,因为它的类型为 Any

选项 1

    guard let data = str.data(using: .utf8),
          let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String:Any]
        else { fatalError("Error") }
     
    print(json["data"] as? [[String:Any]])
     

选项 2

 guard let data = str.data(using: .utf8),
       let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String:[[String:Any]]]

       else { fatalError("Error") }

       print(json["data"])

【讨论】:

    【解决方案2】:

    像这样投射您的数据。根是你的一个字典,你的数据是数据键的值,它是一个数组。所以你可以这样使用它。

        guard let data = str.data(using: .utf8)
            else { fatalError("Error") }
            
            do {
                let json = try? JSONSerialization.jsonObject(with: data, options: [])
                guard let dictData = json as? [String: Any],
                      let resultData = dictData["data"] as? [[String: Any]] else  {
                    return
                }
                
                print(resultData)
            } catch {
                print(error)
            }
    

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 2013-06-20
      相关资源
      最近更新 更多