我很难使用 swift Decodable 协议(protocol)进行解码。我有一个 REST API,它返回以下 JSON
{
data: [
{
id: 17,
status: "published",
created_by: {
id: 1
},
created_on: "2020-01-13 17:38:31",
title: "Lorem ipsum dolor sit amet, consectetur adi",
content: "<p>Mauris id ligula et metus porta rutrum vitae ac mi. Mauris rhoncus sagittis facilisis. Cras suscipit nisi quis risus lacinia dictum. Morbi porttitor, est sodales tristique interdum, erat leo consequat lorem, in cursus metus est eget felis. Cras a sapien massa. Sed tincidunt fermentum imperdiet. Ut velit diam, interdum sit amet lectus vitae, tristiq</p>",
featured_image: {
data: {
full_url: "https://example.com/originals/14eefd0d-93fc-44f6-84a5-7cf86a2e83fc.jpg",
url: "/uploads/abc/originals/14eefd0d-93fc-44f6-84a5-7cf86a2e83fc.jpg",
thumbnails: [...],
embed: null
}
},
source: null,
is_featured: true
}
]
}
以及我的模型的结构
struct PostRoot:Decodable {
let data:[Post]
}
struct Post: Decodable {
let id:Int
let title:String
let created_on:String
let content:String
let source:String
let f_image:FeaturedImage
}
struct FeaturedImage: Decodable {
let data:ImagePath
}
struct ImagePath: Decodable{
let full_url:String
}
// Only included the decoding part, not the request part
if let d = data {
let decodedLists = try JSONDecoder().decode(PostRoot.self, from: d)
print(decodedLists)
}
从我的服务器获得响应后,解码过程总是以错误结束,我是否必须映射每个键?我在这里缺少什么?
这是错误:
Error: keyNotFound(CodingKeys(stringValue: "f_image", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: \"f_image\", intValue: nil) (\"f_image\").", underlyingError: nil))
最佳答案
也许这会有所帮助,它是通过“将 JSON 粘贴为代码”自动生成的,它表明代码中的某些键丢失了。另外一个可能的错误可能是这不是 JSON,键不是字符串,因此无法像这样解码。
// MARK: - PostRoot
struct PostRoot: Codable {
let data: [Post]
}
// MARK: - Post
struct Post: Codable {
let id: Int
let status: String
let createdBy: CreatedBy
let createdOn, title, content: String
let featuredImage: FeaturedImage
let source: String?
let isFeatured: Bool
enum CodingKeys: String, CodingKey {
case id, status
case createdBy = "created_by"
case createdOn = "created_on"
case title, content
case featuredImage = "featured_image"
case source
case isFeatured = "is_featured"
}
}
// MARK: - CreatedBy
struct CreatedBy: Codable {
let id: Int
}
// MARK: - FeaturedImage
struct FeaturedImage: Codable {
let data: DataClass
}
// MARK: - DataClass
struct DataClass: Codable {
let fullURL: String
let url: String
let thumbnails: [String]
let embed: String?
enum CodingKeys: String, CodingKey {
case fullURL = "full_url"
case url, thumbnails, embed
}
}
关于ios - Swift Decodable 无法使用单个根元素进行解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59721903/