2017-06-13 173 views
-1

我嘗試deseralize我的JSON看起來像這樣:反序列化JSON反對

{ 
    "access_token": "This_is_my_token" 
    "item01": "blabla" 
    "item02": "blabla" 
    ... 
} 

,我想只有access_token保存到一個變量。沒什麼大不了的。 對於爲例,用PHP是很簡單的東西,如:

<?php 

    $jsonObj = json_decode($jsonString); 
    $access_token = $jsonObj["access_token"]; 

?> 

但它看起來並不如此簡單與斯威夫特。我嘗試了很多東西,但沒有爲我工作。

這裏是我的代碼:

dataString = String(data: data, encoding: .utf8)! 
      do { 
       let anyObj: AnyObject? = try JSONSerialization.jsonObject(with: dataString, options: JSONSerialization.ReadingOptions([])) as AnyObject 
       guard let access_token = anyObj?.firstItem as? [String: AnyObject] 
        else {return} 
       print(access_token) 

      } catch { 
       print("JSON Deserial. Error") 
      } 

與此代碼,我無法操縱anyObj就像我在PHP $jsonObj做,沒有辦法做這樣的事情anyObj["access_token"]

如何我可以訪問該對象中的這個項目嗎?

感謝

回答

2

得到的accessToken您只需通過傳遞調用這個函數您數據在這裏,它會返回一個字典。從該字典中您可以選擇access_token的值。

class func parseJsonToDictionary(data: Data) -> ([String:AnyObject]?,Error?) { 

     let _ = NSString(data: data, encoding:String.Encoding.utf8.rawValue) 

     do { 
      let JSONObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) 
      return (JSONObject as? [String:AnyObject],nil) 
     } catch let error as NSError { 
      return (nil,error) 
     } 

    } 
+0

我看起來很不錯,但是當我打印(json.0 [「access_token」])輸出是'Optional (my_super_access_token)'而不是'my_super_access_token',你知道爲什麼嗎? – LeCintas

+0

只需使用,如果讓和解壓縮它。然後它將刪除可選。 – vikram

-1

代替鑄造anyObj to AnyObject的嘗試鑄造爲字符串的字典一樣

let anyObj: AnyObject? = try JSONSerialization.jsonObject(with: dataString, options: JSONSerialization.ReadingOptions([])) as [String:String] 

然後,你可以通過使用anyObj["access_token"]

+0

它不工作,因爲'.jsonObject'生成'Any',所以它不會編譯 – LeCintas

1

如果您有json字符串而不是json數據,那麼您可以使用此方法將其轉換爲字典。

func convertToDictionary(text: String) -> [String: Any]? { 
    if let data = text.data(using: .utf8) { 
     do { 
      return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] 
     } catch { 
      print(error.localizedDescription) 
     } 
    } 
    return nil 
} 

let str = "{\"name\":\"James\"}" 

let dict = convertToDictionary(text: str) 

後來,您可以從字典中獲取access_token的值。