2017-01-25 51 views
1

所以我遇到了Swift 3的问题。我向我的服务器发送了一个get调用,并且我得到了我期望的数据。但我不知道如何从jsonArray创建对象,以便我可以轻松访问数据。Swift 3 - 无法弄清楚如何从jsonArray创建json对象

这是迄今为止我FUNC:

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。有人可以帮忙吗?

在此先感谢!

+0

可能重复的[将一个JSON数组反序列化为一个Swift数组对象](http://stackoverflow.com/questions/37149588/deserialize-a-json-array-to-a-swift - 对象的阵列) – shallowThought

回答

0

你的问题是,响应不是字符串数组(Array<String>),其Dictionary<String,Any>阵列(Array<Dictionary<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.

+0

这有效奇迹!谢谢一堆。 –

0

我不是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的建议,这使得它更清洁。