【问题标题】:Get JSON and Parse it in Swift?获取 JSON 并在 Swift 中解析它?
【发布时间】:2017-06-09 00:24:19
【问题描述】:

我通过 httpget 请求从 url 获取 json 文件。然后,我想将所有来自 json 的标签打印到屏幕上。我使用此代码来执行此操作,但是我无法以这种方式获得。你能帮帮我吗?

Swift 3 代码:

let url:URL = URL(string: "https://api.hurriyet.com.tr/v1/articles...deleted...")!
let session = URLSession.shared

var request = URLRequest(url: url)
request.httpMethod = "GET"
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)

let task = session.dataTask(with: request as URLRequest) {
    (data, response, error) in

    guard let data = data, let _:URLResponse = response, error == nil else {
        print("error")
        return
    }

    let dataString =  String(data: data, encoding: String.Encoding.utf8)

    for tags in data{
        for tag in tags["Tags"]{
            print(tag)
        }
    }


}

task.resume()

示例 json 输出和 dataString 变量的输出:

"[{"标签":["fırat","kalkanı 歌剧","gazetehaberleri"]},{"标签":["yüksek yargı","adliye","gazetehaberleri"]},{"标签":["foo","Hüseyin Avni Mutlu","Hüseyin Çapkın","gazetehaberleri"]}]"

【问题讨论】:

  • 您需要解析json字符串并将其转换为字典。有一些解析 json 的库(你可以在 github 上搜索),我认为 Foundation 中也有一个内置解析器 developer.apple.com/swift/blog/?id=37
  • 我无法将 json 转换成字典,你能帮帮我吗? @LeoDabus
  • 好的,我已经处理好了,但是,我怎样才能得到标签呢?因为无法像 jsonParsed["Tags"] 等那样获得它们...... @LeoDabus
  • 使用swiftyJson轻松解析json

标签: json swift get


【解决方案1】:

首先是关于您的代码的一些注释。将 URLRequest 转换为 URLRequest 是多余的。您需要使用带有数据方法的 JSONSerialization jsonObject 将您的 json 数据解析为字典数组:

let jsonString = "[{\"Tags\":[\"fırat\",\"kalkanı operasyonu\",\"gazetehaberleri\"]},{\"Tags\":[\"yüksek yargı\",\"adliye\",\"gazetehaberleri\"]},{\"Tags\":[\"foo\",\"Hüseyin Avni Mutlu\",\"Hüseyin Çapkın\",\"gazetehaberleri\"]}]"

let data = Data(jsonString.utf8)

let dictionaries = (try? JSONSerialization.jsonObject(with: data)) as? [[String:Any]] ?? []

for dict in dictionaries {
    let tags = dict["Tags"] as? [String] ?? []

    for tag in tags {
        print(tag)  // fırat
                    // kalkanı operasyonu
                    // gazetehaberleri
                    // yüksek yargı
                    // adliye
                    // gazetehaberleri
                    // foo
                    // Hüseyin Avni Mutlu
                    // Hüseyin Çapkın
                    // gazetehaberleri
    }
}

【讨论】:

    【解决方案2】:

    您的 json 输出响应格式为字典数组[[String: Any]]

    所以解析它的简单方法是

    do {
        // parse from data to array of dictionaries
        if let parsedData = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] {
            print(parsedData)
        }
    }
    catch {
        print(error)
    }
    

    【讨论】:

    • 那我能做些什么来获取所有的标签呢?因为 print(parsedData["Tags"]) 犯了一个错误,例如:不能用 'String' 类型的索引为 '[[String : Any]]' 类型的值下标
    • @CrisAngelordan 添加您当前的代码for tags in parsedData
    • 好的,但是它只能获取第一个标签部分,第二,第三个标签无法通过此循环获取。我试过了:for dict in parsedData { for parsed in dict["Tags"] { print(parsed) } }。但是,有一个错误:输入“任何?”不符合协议“序列”@LeoDabus
    • 添加 for parsed in dict["Tags"] as! [String] { // print } 使其成为字符串数组
    猜你喜欢
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多