2017-01-25 4 views
1

Так что у меня возникают проблемы с Swift 3. Я отправляю вызов на свой сервер, и я возвращаю данные, которые ожидаю. Однако я не могу понять, как создавать объекты из jsonArray, чтобы я мог легко получить доступ к данным.Swift 3 - Не могу понять, как создавать json объекты из jsonArray

Это мой 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

Возможный дубликат [Deserialize массив JSON для массива Swift объектов] (http://stackoverflow.com/questions/37149588/deserialize-a-json-array-to-a-swift -array-of-objects) – shallowThought

ответ

0

Ваш вопрос ответ не является массивом строк (Array<String>), его массив Dictionary<String,Any> (Array<Dictionary<String,Any>> или более просто [[String: Любой]]). Попробуйте следующее:

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 объекта» вы хотите, ближе всего к что Свифту является Словарем, который находится в массиве 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] будет заменен на индекс цикла, конечно. Этот код уродлив, поэтому я бы рекомендовал принять предложение Рассела, что делает его БОЛЕЕ чистым.

 Смежные вопросы

  • Нет связанных вопросов^_^