将JSON从String反序列化为对象

时间:2017-06-13 07:16:15

标签: ios json swift

我尝试解除看起来像这样的JSON:

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

我只想将access_token保存到变量中。没有大碍。 例如,使用PHP,它非常简单:

<?php

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

?>

但是使用Swift看起来并不容易。我尝试了很多东西,但没有什么对我有用。

这是我的代码:

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")
            }

使用此代码,我无法像在PHP中使用anyObj一样操纵$jsonObj,无法执行anyObj["access_token"]

之类的操作

如何在对象中访问此项目?

由于

3 个答案:

答案 0 :(得分:2)

您可以通过在此处传递数据来调用此函数,它将返回一个字典。从该字典中,您可以选择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)
        }

    }

答案 1 :(得分: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的值。

答案 2 :(得分:-1)

而不是强制转换anyObj to AnyObject,而是将其转换为字符串字典,如

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

然后您可以使用anyObj["access_token"]

获取accessToken