所以我遇到了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。有人可以帮忙吗?
提前致谢!
答案 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的建议,这样可以更清洁。
答案 1 :(得分:0)
您的问题是响应不是字符串数组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数组中的Dictionary。因此json[0]["id"]
将返回1.