我想在Swift中构造JSON数组,以便可以使用它,但是我尝试的所有操作都会引发错误。这是我正在使用的JSON:
[
{
"id": 15438,
"date": "2019-05-07T03:36:51",
"date_gmt": "2019-05-07T00:36:51",
"type": "post",
"title": {
"rendered": "Title Here"
}
}
]
这是我正在使用的代码:
struct getTitle: Decodable {
let title: [Title]
}
struct Title: Decodable {
let rendered: String?
}
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "URL HERE"
guard let url = URL(string: jsonUrlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
let titleresult = try JSONDecoder().decode(getTitle.self, from: data)
print(titleresult)
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}.resume()
}
}
它引发的错误是:
Error serializing json: typeMismatch(Swift.Dictionary<Swift.String,
Any>, Swift.DecodingError.Context(codingPath: [], debugDescription:
"Expected to decode Dictionary<String, Any> but found an array
instead.", underlyingError: nil))
我已经尝试使用
JSONDecoder().decode([getTitle].self, from: data)
将其设置为数组,但是会抛出相同的错误,但转过身来。它期望一个数组,但是找到了一个字典。
我不确定这是什么问题。我已经尝试遵循多个指南,但是它们都导致相同的结果。我做错的结构可能与某件事有关,但我不知道是什么。
答案 0 :(得分:2)
请仔细,完整地阅读错误消息,它们具有极强的描述性。
打算解码Dictionary,但找到一个数组
表示找到的对象是一个数组。修复
JSONDecoder().decode([getTitle].self, from: data)
基本上是正确的。但是随后的错误却大不相同
... codingPath:[_ JSONKey(stringValue:“索引0”,intValue:0),CodingKeys(stringValue:“ title”,intValue:nil)],debugDescription:“希望对Array进行解码,但找到了字典。 “
请注意 codingPath ,它的读取方式类似于键路径[0].title
:根数组第一项中的键title
的值为不是一个数组,因此将结构更改为
struct getTitle: Decodable {
let title: Title
}
读取JSON非常容易:{}
是成为结构的字典,[]
是数组。
最后请用首字母大写来命名结构。
答案 1 :(得分:1)
尝试一下:
struct getTitle: Decodable {
let title: Title
}
struct Title: Decodable {
let rendered: String?
}
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "URL HERE"
guard let url = URL(string: jsonUrlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
let titleresult = try JSONDecoder().decode([getTitle].self, from: data)
print(titleresult)
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}.resume()
}
}
答案 2 :(得分:0)
您有一个<div class="el-item">XXX<p class="texte-a-hover"> text </p></div>
的根数组是字典而不是数组
title
struct getTitle: Codable {
let title: Title
}
struct Title: Codable {
let rendered: String
}