我该如何解析这个使用Swift 3.0的JSON对象
问题描述:
我想解析从新API返回的JSON字符串。返回的JSON字符串如下所示。我该如何解析这个使用Swift 3.0的JSON对象
QuerySearchResult":{
"StartAt":"1",
"Count":"40",
"TotalAvailable":"500",
"Items":[
{"TITLE":"OST420 Generation",
"PATH":"http:\\Test.pdf",
"WRITE":"2016-12-12T15:47:42",
"RANK":"32286574",
"SIZE":"145091",
"ISDOCUMENT":"true",
"ID":"18548",
"WPTASK":"Onsite Generation",
"WPDOCTYPE":"Local Operating Procedure",
"WPDOCREFID":"304580",
"WPCONTENTTYPE":"Document"},
{"TITLE":"OST420 Measurement",
"PATH":"http:\Test33.pdf",
.
.
我正在使用下面的代码接受JSON变量,但失败时,我尝试加载项目。我试过使用Array
约Dictionary
但它仍然失败。我需要在项目中读取什么声明?
if let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as? Dictionary<String, AnyObject> {
for item in json {
if let dict = item as? Dictionary<String, AnyObject> {
if let items = json["Items"] as? Array<Dictionary<String, AnyObject>> {
for rec in items {
if let title = rec["TITLE"] as? String {
let xx = title
}
}
}
}
}
答
你没有正确通过Dictionary
也迭代,而不是通过Dictionary
访问单个值循环首先,通过直接访问它通过subscripting
和斯威夫特3 Dictionary
正确的JSON对象是[String : Any]
尝试。
if let json = try? JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any],
let queryDic = json["QuerySearchResult"] as? [String : Any],
let items = queryDic["Items"] as? [[String : Any]] {
for item in items {
if let title = item["TITLE"] as? String {
print(title)
}
}
}
答
使用SwiftyJSON:它可以简单轻松地解析JSON,而不是您的代码。
那么,我们该如何解析?
首先得到你的数据()响应
let jsonData = JSON(data: results!)
那么在这里,我们如何解析JSON。
import Foundation
import SwiftyJSON
enum JSONParseError : ErrorType {
case UnknownField
case EmptyJSON
}
extension JSONParseError : CustomStringConvertible {
var description: String {
switch self {
case .UnknownField:
return "Error when parsing json because there is no field"
case .EmptyJSON:
return "Error when parsing empty json"
}
}
}
guard let querySearchResult : [String : JSON] = jsonData["QuerySearchResult"].dictionary else{
throw JSONParseError.UnknownField
}
guard let startAt : String = querySearchResult["StartAt"].string else{
throw JSONParseError.UnknownField
}
guard let count : String = querySearchResult["Count"].string else{
throw JSONParseError.UnknownField
}
guard let totalAvailable : String = querySearchResult["TotalAvailable"].string else{
throw JSONParseError.UnknownField
}
guard let items : [JSON] = querySearchResult["Items"].array else{
throw JSONParseError.UnknownField
}
if items.count > 0 {
for i in 0 ..< items.count{
guard let title = items[i]["TITLE"].string else{
throw JSONParseError.UnknownField
}.... //So On
}
}else{
throw JSONParseError.EmptyJSON
}
答
Json将数据转换为字典和数组格式,所以像这样对待json数据,这会让你更容易理解。
大括号'{'和'}'中的数据是字典。
和大括号'['或']'中的数据是数组。
现在开始解析JSON数据的字典和数组属性它正好工作。或者用于确认打印您的json数据。
答
在雨燕3.1: -
func parseJson(anyObj:AnyObject) {
if let anyObj = anyObj as? Array<Dictionary<String,AnyObject>> {
self.yourArrayName = anyObj.flatMap({yourModelName(json:$0) })
}
}
如果你不明白JSON是如何工作的,你可以通过打印的JSONObject开始 - 你命名为“JSON”,并亲眼看看它是如何存储,从那里你将获得更清晰的图片,了解如何访问每个数据。 –
没有日志或任何东西?你怎么知道哪一部分失败呢? –