我正在尝试解析格式为json的数组:
[{"id":1,"date":1596827226.558827,"at":"@mrpit", "name":"Pitmen", "content":"This is the first post, There is a bunch of interesting information in here"},
{"id":2,"date":1596827234.901298, "at":"@mrben", "name":"Benman", "content":"This is the second post, pretend there is a bunch of scientific information in here."},
{"id":3,"date":1596827268.411034, "at":"@mrgreen", "name":"The Green Machine", "content":"This is the thrid post, idk what you wanna pretend is here, maybe something political"},
{"id":4,"date":1596834988.94011, "at":"@mrman", "name":"The Man who Can", "content":"And finally we are at the forth post, there is tons going on here, maybe even something offensive."}]
而且我很麻烦,因为根对象似乎是一个数组。
我正在尝试使用这样的东西
struct DataSet: Decodable {
let post: [SinglePost]
}
struct SinglePost: Decodable{
let id: Int
let date: Double
let at: String
let name: String
let content: String
}
static func getPost(returnWith: @escaping (DataSet?, Bool)->()) {
let session = URLSession.shared
let decoder = JSONDecoder()
let uString = serverUrl
if let url = URL(string: serverUrl + "/post/") {
let task = session.dataTask(with: url, completionHandler: { data1, response, error in
if (error != nil) {
returnWith(nil, false)
return
}
if let dataString = String(data: data1!, encoding: .utf8) {
print(dataString)
do {
let postSet = try decoder.decode(DataSet.self, from: Data(dataString.utf8))
returnWith(postSet, true)
}
catch let jsonError {
print("Error Serializing JSON", jsonError)
returnWith(nil, false)
}
} else {
returnWith(nil, false)
}
})
task.resume()
}
}
但这是行不通的。
这样做的最好方法是什么。抱歉,我还挺新的,所以可能会有一个明显的答案。
那里的问题是您试图解码字典而不是数组。
只是改变
let postSet = try decoder.decode(DataSet.self, from: Data(dataString.utf8))
至
let postSet = try decoder.decode([SinglePost].self, from: Data(dataString.utf8))
编辑/更新:
关于方法签名,只需将其更改为返回数组而不是DataSet结构,我将返回错误而不是Bool:
static func getPost(completion: @escaping ([SinglePost]?, Error?) -> ()) {
let session = URLSession.shared
let decoder = JSONDecoder()
if let url = URL(string: serverUrl + "/post/") {
let task = session.dataTask(with: url) { data, response, error in
guard let data = data else {
completion(nil, error)
return
}
do {
completion(try decoder.decode([SinglePost].self, from: data), nil)
} catch {
print("Error Decoding JSON", error)
completion(nil, error)
}
}
task.resume()
}
}
用法:
getPost { posts, error in
guard let posts = posts else {
print(error ?? "")
}
for post in posts {
print(post)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句