Swift 3 - 无法弄清楚如何从 jsonArray 创建 json 对象

Posted

技术标签:

【中文标题】Swift 3 - 无法弄清楚如何从 jsonArray 创建 json 对象【英文标题】:Swift 3 - Can't figure out how to create json Objects from jsonArray 【发布时间】:2017-01-25 14:41:51 【问题描述】:

所以我在使用 Swift 3 时遇到了问题。我正在向我的服务器发送一个 get 调用,并且我得到了我期望的数据。但是我不知道如何从 jsonArray 创建对象,所以我可以轻松访问数据。

这是我目前的功能:

func getAllRoles(refreshToken: String)
    print("vi kører getAllRoles \(refreshToken)")

    let urlPath = "http://keebintest-pagh.rhcloud.com/api/users/allroles/"
    let url = NSURL(string: urlPath)
    let session = URLSession.shared
    let request = NSMutableURLRequest(url: url as! URL)

    request.addValue(refreshToken, forHTTPHeaderField: "refreshToken")
    request.httpMethod = "GET"



    let task = session.dataTask(with: request as URLRequest, completionHandler: data, response, error -> Void in
        print("Task completed \(data) and response is xxxx")

        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        print("responseString = \(responseString!)")



        //            Her laver vi data om til en dictionary
        //            let s = (try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers)) as! String
        //            print("det virkede?")
        //            print(s)

        //            var json: Array<String>!
        //            do 
        //                json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions()) as? Array
        //             catch 
        //                print(error)
        //            
        //
        //            print("her er mit json \(json[0])")






    )
    task.resume()

这是我的控制台日志的样子:

Task completed Optional(56 bytes) and response is xxxx
responseString = ["id":1,"roleName":"Admin","id":2,"roleName":"User"]
here is my json 
    id = 2;
    roleName = User;

所以很明显我得到了我的数据,它在一个我可以访问的数组中。但是我不知道如何从数组中的每个创建 jsonObjects。有人可以帮忙吗?

提前致谢!

【问题讨论】:

Deserialize a JSON array to a Swift array of objects的可能重复 【参考方案1】:

您的问题是响应不是字符串数组 (Array&lt;String&gt;),而是 Dictionary&lt;String,Any&gt; 数组(Array&lt;Dictionary&lt;String,Any&gt;&gt; 或更简单的 [[String:Any]])。请尝试以下操作:

var json: [[String:Any]]!
do 
    json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [[String:Any]]
 catch 
    print(error)

虽然我建议不要使用“!”并使用可选项或默认值,例如:

var json:[[String:Any]] = []
if let data = data, let jsonResponse = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [[String:Any]] 
    json = jsonResponse

现在,至于您想要的“json 对象”,与 swift 中最接近的是 Dictionary,它位于我的示例中的 json 数组中。所以json[0]["id"] 会返回 1。

【讨论】:

【参考方案2】:

我不是 100% 确定我理解您所说的“从 jsonArray 创建对象以便我可以轻松访问数据”的意思,但假设您只想从 json 中获取数据并进入您的模型对象,它看起来你已经在正确的道路上。只需将数据输入数组构建器,然后解析它...

    if let JSONObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]],
       let role = (JSONObject[0]["roleName"] as? [String: Any])?["roleName"] as? String 
        // do something with the role name here
     

当然,[0] 将被替换为循环索引。这段代码很难看,所以我建议采纳 Russel 的建议,这样会更干净。

【讨论】:

以上是关于Swift 3 - 无法弄清楚如何从 jsonArray 创建 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

使用 swift 我无法弄清楚视频停止后如何进入新屏幕

无法弄清楚如何在 Swift 中使用 NSURLSession 将 jsonData 加载到 NSDictionary

斯威夫特:无法弄清楚如何保存用户离开表格视图的方式

无法弄清楚 Swift 中 AudioQueueDispose 的用法

如何在swift 3中恢复标签可见性状态