代码之家  ›  专栏  ›  技术社区  ›  Steffen L.

Swift 3-不知道如何从jsonArray创建json对象

  •  1
  • Steffen L.  · 技术社区  · 8 年前

    因此,我在使用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;
    }
    

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

    提前感谢!

    2 回复  |  直到 8 年前
        1
  •  0
  •   Jose Castellanos    8 年前

    问题是响应不是字符串数组( Array<String> ),它是一个数组 Dictionary<String,Any> ( Array<Dictionary<String,Any>> 或者更简单地说 [[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中最接近的是字典,它位于我的示例中的json数组中。所以 json[0]["id"] 将返回1。

        2
  •  0
  •   Nazmul Hasan    8 年前

    我不能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的建议,这使它更干净。