ios - Swift Decodable 无法使用单个根元素进行解码

标签 ios json swift

我很难使用 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/

相关文章:

swift - Alamofire 非阻塞连接

swift - 使用 Swift 的 URL 请求

objective-c - 无法弄清楚如何在 UIViewController 中一起使用 UINavigationControllerDelegate 和 pushViewController

android - Android 和 iOS 上的 Facebook 用户 ID

ios - ios 10 的模拟器 .app 在 ios 8 中不起作用

javascript - ReactJS 中的嵌套对象

android - 在 android 中使用 Volley 从 JSON 下载大数据

swift - SceneKit - 添加图像作为法线贴图

ios FBDialogs presentShareDialogWithLink 回调返回错误

android - Android 中的 ClassDefNotFound 错误