Swift JSON 解析和打印数组中的指定值

Posted

技术标签:

【中文标题】Swift JSON 解析和打印数组中的指定值【英文标题】:Swift JSON parsing and printing a specified value from an array 【发布时间】:2017-07-03 20:15:56 【问题描述】:

您好,我正在尝试从某个 JSON API 获取数据。我可以从 API 中获取所有值的快照,如下所示。但我无法将特定行放入变量中。这是我得到的 JSON 格式。我想打印“描述”值。有人可以帮我吗?

Hier 是我的代码:

func apiRequest() 
    let config = URLSessionConfiguration.default
    let username = "F44C3FC2-91AF-5FB2-8B3F-70397C0D447D"
    let password = "G23@rE9t1#"
    let loginString = String(format: "%@:%@", username, password)
    let userPasswordData = loginString.data(using: String.Encoding.utf8)
    let base64EncodedCredential = userPasswordData?.base64EncodedString()
    let authString = "Basic " + (base64EncodedCredential)!

    print(authString)
    config.httpAdditionalHeaders = ["Authorization" : authString]
    let session = URLSession(configuration: config)

    var running = false
    let url = NSURL(string: "https://start.jamespro.nl/v4/api/json/projects/?limit=10")

    let task = session.dataTask(with: url! as URL) 
        ( data, response, error) in
        if let taskHeader = response as? HTTPURLResponse 
            print(taskHeader.statusCode)
        
        if error != nil 
            print("There is an error!!!")
            print(error)
         else 
            if let content = data 
                do 
                    let array = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                    print(array)

                    if let items = array["items"] 
                         if let description = items["Description"] as? [[String:Any]]
                            print(description as Any)
                         
                    
                
                catch 
                    print("Error: Could not get any data")
                
            
        
        running = false
    


    running = true
    task.resume()

    while running 
        print("waiting...")
        sleep(1)
    

【问题讨论】:

【参考方案1】:

首先array不是数组而不是AnyObject,它是一个字典,在Swift 3中是[String:Any]

let dictionary = try JSONSerialization.jsonObject(with: content) as! [String:Any]
print(dictionary)

我不知道为什么所有教程都建议.mutableContainers 作为选项。这在 Objective-C 中可能有用,但在 Swift 中完全没有意义。省略参数。

items 的对象是一个字典数组(同样,Swift 3 中未指定的 JSON 类型是 Any)。使用重复循环获取所有 description 值,您必须向下转换 a从Any 到预期类型的​​字典。

if let items = dictionary["items"] as? [[String:Any]] 
   for item in items 
       if let description = item["Description"] as? String 
          print(description)
       
   

【讨论】:

非常感谢!不,我明白了。你真的帮了我大忙!【参考方案2】:

看起来 items 是一个需要循环遍历的数组。这是一些示例代码,但我想警告您,此代码未针对您的数据进行测试。

if let items = array["items"] as? [[String: AnyObject]] 
    for item in items 
        if let description = item["Description"] as? String
            print("Description: \(description)")
        
    

上面的这段代码,或者它的一些变体,应该能让你走上正轨。

【讨论】:

【参考方案3】:

使用 SwiftyJSON,它会像 json["items"][i].arrayValue 一样简单,作为返回和带有项目值的数组或 json["items"][i]["description"].stringValue 从一行中获取字符串

【讨论】:

以上是关于Swift JSON 解析和打印数组中的指定值的主要内容,如果未能解决你的问题,请参考以下文章

如何正确解析 SWIFT 中的 JSON 对象

使用 swift 将数组保存和检索到用户默认值

如何将 alamofire 返回 json 解析为 Swift 中的字符串数组?

Json解析Swift没有得到打印

如何解析 JSON 以将其转换为 Swift 中的对象数组?

我如何使用解码器在swift 4中解析tableview中的json数组