[英]parse JSON, iOS, Swift4
我正在尝试解析一些 json,但输出中似乎为零。
我不确定我哪里出错了,可以使用一些帮助来解决这个问题。
struct albumInfo: Decodable {
var name: String?
var artist: String?
var url: String?
var playcount: String?
var listeners: String?
var releasedate: String?
var summary: String?
}
class SearchVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Choice = "album"
Album = "Believe"
Artist = "Cher"
let tryURL = "\(BASE_URL)\(Choice!).getinfo&api_key=\(API_KEY)&artist=\(Artist!)&album=\(Album!)&format=json"
print(tryURL)
guard let url = URL(string: tryURL) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
let albumDescription = try JSONDecoder().decode(albumInfo.self, from: data)
print(albumDescription.artist)
}catch let jsonErr {
print("Error seroalizing json", jsonErr)
}
}.resume()
}
这是与 tryUrl 一起显示的数据。
首先请遵守结构名称以大写字母开头的命名约定。
有两个主要问题:
album
的字典,其中包含带有键name
, listeners
等的字典。summary
在关键wiki
另一个字典中。 JSON 的结构很容易识别。 每对大括号 ( {}
) 内的主体代表一个单独的结构。
此外,没有键releasedate
因此必须将此结构成员声明为可选,所有其他成员都可以声明为非可选和常量( let
)。 url
可以免费声明为URL
。
将您的结构更改为
struct Root : Decodable {
let album : AlbumInfo
}
struct AlbumInfo: Decodable {
let name: String
let artist: String
let url: URL
let playcount: String
let listeners: String
let releasedate: String?
let wiki : Wiki
}
struct Wiki: Decodable {
let content: String
let published: String
let summary: String
}
并解码Root
let albumDescription = try JSONDecoder().decode(Root.self, from: data)
print(albumDescription.album.artist)
您响应的第一个键是“相册”,您需要先解析它。
这些类与 json 不对应,我想您应该使用以下方法(新类实现您的解码、编码协议):
class JsonInfo {
var album : albumInfo
}
do {
let albumDescription = try JSONDecoder().decode(albumInfo.self, from: data)
print(albumDescription.album.artist)
}catch let jsonErr {
print("Error seroalizing json", jsonErr)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.