用解码器Swift的init解码JSON

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用解码器Swift的init解码JSON相关的知识,希望对你有一定的参考价值。

我正在我的应用中使用NewsAPI。他们的回复格式如下:

{
  "status": "ok",
  "totalResults": 38,
  "articles": [
    {
      "source": {
        "id": "cnn",
        "name": "CNN"
      },
      "author": "Eric Levenson and Lauren del Valle, CNN",
      "title": "Actress Annabella Sciorra is in court at Harvey Weinstein's trial for potential testimony - CNN",
      "description": "Actress Annabella Sciorra is in court for Harvey Weinstein's criminal trial, setting up what could be the first face-to-face testimony from one of the women who has accused him of sexual assault.",
      "url": "https://www.cnn.com/2020/01/23/us/harvey-weinstein-annabella-sciorra/index.html",
      "urlToImage": "https://cdn.cnn.com/cnnnext/dam/assets/200123090608-annabella-sciorra-file-super-tease.jpg",
      "publishedAt": "2020-01-23T16:22:00Z",
      "content": "New York (CNN)Actress Annabella Sciorra is in court for Harvey Weinstein's criminal trial, setting up what could be the first face-to-face testimony from one of the women who has accused him of sexual assault.
"The Sopranos" actress has said Weinstein raped … [+5398 chars]"
    },
    {
      "source": {
        "id": "ars-technica",
        "name": "Ars Technica"
      },
      "author": "Jennifer Ouellette",
      "title": "Jewel beetle’s bright colored shell serves as camouflage from predators - Ars Technica",
      "description": "University of Bristol scientists offer first real evidence for a 100-year-old theory.",
      "url": "https://arstechnica.com/science/2020/01/study-jewel-beetles-use-iridescence-for-camouflage-not-sexual-selection/",
      "urlToImage": "https://cdn.arstechnica.net/wp-content/uploads/2020/01/beetleTOP-760x380.jpg",
      "publishedAt": "2020-01-23T16:00:00Z",
      "content": "Enlarge/ The brightly colored shell of this jewel beetle is a surprisingly effective form of camouflage, according to a new study by scientists at the University of Bristol.
23 with 20 posters participating
Artist and naturalist Abbott Handerson Thayer beca… [+5422 chars]"
    }]
}

我有一种使用此数据的方法,但是它涉及太多不必要的结构/类。有没有办法将响应中的articles数组解码为如下定义的结构Article

struct Article: Decodable {
    let author: String?
    let title: String?
    let description: String?
    let url: String?
    let urlToImage: String?
    let publishedAt: String?
}

谢谢您的时间:)

答案

是,您只能获取您感兴趣的部分。

1。定义模型

struct Response: Decodable {

    let articles: [Article]

    struct Article: Decodable {
        let author: String
        let title: String
        let description: String
        let url: URL
        let urlToImage: URL
        let publishedAt: String
    }
}

[请注意,我更新了您的Article结构,使字段变为非可选。如果API文档将这些字段定义为可选字段,请还原为您的版本。我也将URL类型用于几个字段,因为它感觉更正确。

2。解码

do {
    let response = try JSONDecoder().decode(Response.self, from: data)
    let articles = response.articles
    print(articles)
} catch {
    print(error)
}

以上是关于用解码器Swift的init解码JSON的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 - Json 解码器

Swift Json 响应解码

Swift - 使用 init 初始化模型对象(来自解码器:)

Swift 4 可解码的 json 数组

如何在 Swift 中使用动态键(在根级别)解码此 JSON?

Swift - JSON解码返回空数组