在Swift中解析JSON并访问值?

时间:2018-02-17 03:31:36

标签: json swift

我已成功解析JSON:

birthday = "04/10/1986";
    id = 202038339983;
    location =     {
        city = Jupiter;
        country = "United States";
        state = FL;
    };

我的问题是当JSON的一部分是:

    submissions =     {
     data =         (
                        {
                "created_time" = "2018-02-16T05:11:56+0000";
                id = "131448394823824_167398094382256";
                viewer = "Any random string and/or emojis";
            },

                    {
            "created_time" = "2018-02-14T23:36:41+0000";
            id = "809809871824_8908987486899";
            message = "vday \Ud83d\Udda4\U2665\Ufe0f";
        });}

我应该如何访问created_time,id,viewer和message?

我已经能够使用以下代码将完整的提交JSON响应打印到控制台:

           guard let jsonD = responseFromServer as? [String : Any] else {return}
            let subs1 = (jsonD["submissions"] as? [String : Any])
            let accessSubs1 = theSubs1
            guard let parsedPost = theSubs1  else {
                return
            }

我的控制台将显示:

    ["data": <__NSArrayI 0x6040001a86c0>(
{
                   "created_time" = "2018-02-16T05:11:56+0000";
                    id = "131448394823824_167398094382256";
                    viewer = "Any random string and/or emojis";
                },

                        {
                "created_time" = "2018-02-14T23:36:41+0000";
                id = "809809871824_8908987486899";
                message = "vday \Ud83d\Udda4\U2665\Ufe0f";
            })]

我的问题是我应该如何解析JSON以便我可以在提交内部访问created_time?

这是HTTP请求:

    struct XClass: RequestProtocol {

    var Path = "/User"
    var parameters: [String : Any]? = ["stuff": "id, birthday, location, submissions"]
    var aToken = aToken.current
    var httpMethod: RequestHTTPMethod = .GET
    var apiVersion: APIVersion = .defaultVersion

    struct Response: ResponseProtocol {

        var id = String()
        var birthday = String()
        var city = String()
        var state = String()
        var country = String()
        var viewSubs = [String : Any]()



        init(XResponse: Any?) {


            guard let jsonD = XResponse as? [String : Any] else {return}
            id = (jsonD["id"] as? String)!
            birthday = (jsonD["birthday"] as? String)!
            let XArr = (jsonD["location"] as? [String : String])
            city = XArr!["city"]!
            country = XArr!["country"]!
            state = XArr!["state"]!
            let subs1 = (jsonD["submissions"] as? [String : Any])
            let accessSubs1 = theSubs1
            guard let parsedPost = theSubs1  else {
                return
            }
            viewSubs = theSubs1
            }}}

                func getXData(){
           let connection = RequestConnection()
           connection.add(XClass()) { response, result in
           switch result {
               case .success(let response):
                  print("Request Succeeded: \(response)\n\n\n")
               case .failed(let error):
                  print("Request Failed: \(error)")
          }}
              connection.start()
           }

2 个答案:

答案 0 :(得分:0)

创建结构

struct Data: Decodable {
    var created_time : String
    var id : String
    var viewer : String
}

从URLSession

调用api url
guard let url = URL(string: "your api url")
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
   print(error.localizedDescription)
} else {
   guard let data = data else {return}
   var data: [Data]() = JSONDecoder().decode(Data.self, data)
   for dat in data{
       print(dat.created_time)
       print(dat.id)
       print(dat.viewer)
   }
}

答案 1 :(得分:0)

如果你没有使用Swift 4中的 Decodable ,或者仍然使用Swift 3, 然后你可以指定&#34;提交的数据&#34;是一个 字典数组 (双括号)然后你可以迭代它。

更改

        let subs1 = (jsonD["submissions"] as? [String : Any])

        let subs1 = (jsonD["submissions"] as? [[String : Any]])

        for sub in subs1 {
            let time = sub["created_time "] as? [String : Any]
            ...
        }