Swift 4 Playground - получение объекта / результата из JSON
Я использую Swift 4 в Playgrounds (MacOS), тестирую свой код как начинающий... Я хотел бы получить объект / результат title из удаленного JSON.
Код работает до точки 'print(object.title)', которая, как я надеялся, вернет значение первого заголовка в импортированном JSON.
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
// Create structer of Post
struct Post: Codable {
var userId: Int
var title: String
var body: String
}
// Remote JSON to Structed Object
let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
let jsonData = try! Data(contentsOf: url)
let datastring = String(data: jsonData, encoding: .utf8)
let decoder = JSONDecoder()
do {
// Decode data to object
let object = try decoder.decode(Post.self, from: jsonData)
print(object.title)
}
catch {
// Error Catch
//print(error)
}
2 ответа
Решение
Пожалуйста (научитесь) читать JSON. Корневой объект - это массив (представленный []
) так что нужно декодировать [Post]
и цикл для печати всех элементов:
let object = try decoder.decode([Post].self, from: jsonData)
for post in object {
print(post.title)
}
и никогда, никогда, никогда не игнорируйте ошибки
} catch {
print(error)
}
Также обратите внимание на все возможности Swift4. Я имею в виду кодирование, декодирование и сериализацию в Swift 4. Итак, вы можете поиграть с этим. Я добавил код для игровой площадки:
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
typealias JSONModel = [JSONModelElement]
class JSONModelElement: Codable {
let userID, id: Int?
let title, body: String?
enum CodingKeys: String, CodingKey {
case userID = "userId"
case id, title, body
}
}
let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
let jsonData = try! Data(contentsOf: url)
if let jsonModel = try? JSONDecoder().decode(JSONModel.self, from: jsonData) {
for element in jsonModel {
print(element.title)
}
}
Удачного кодирования!