2017-01-25 7 views
1

私はSwift 3に問題があります。私のサーバーに電話をかけています。しかし、データに簡単にアクセスできるように、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配列をデシリアライズ](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>>以上の単純[任意] [文字列])ではな​​いです。以下を試してください:

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

"!"代わりに、同じようoptionalsまたはデフォルトを使用して:

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

私はあなたが「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の提案を取ることをお勧めします。

関連する問題