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 解析和打印数组中的指定值的主要内容,如果未能解决你的问题,请参考以下文章
如何将 alamofire 返回 json 解析为 Swift 中的字符串数组?