如何在Swift中解码JSON
#初学者 #braziliandevs #ios #swift

语境

对于那些开始的人,也许想知道:为什么我需要知道如何在JSON中解码遏制?

JSON格式广泛使用各种语言以结构化的方式存储和传输信息。以下是常见场景的一些示例:

  • 存储配置的JSON文件
  • 消耗以JSON格式做出响应的安息API。
  • 滚动ContendoInformin§为什么不json格式。

在此文章中,我们将看到如何使用Swift语言读取和解码JSON格式。

概括

读取json

在Swift中读取JSON的第一步是将其遏制转换为Data格式(一种Swift语言),该格式将用于解码我们将在未来定义的类型中的信息。以下是每种风景转换的示例:

细绳

下面,我们有一个字符串的示例,其中包含JSON格式的帖子列表:

let jsonContent = """
[
  {
    "id":1,
    "title":"Como se tornar um programador",
    "content":"Para se tornar um programador, é necessário estudar linguagens de programação e desenvolver habilidades de resolução de problemas.",
    "created_at":"2023-04-18T14:00:00Z"
  },
  {
    "id":2,
    "title":"Os benefícios da meditação",
    "content":"A meditação pode ajudar a reduzir o estresse, melhorar a qualidade do sono e aumentar a sensação de bem-estar.",
    "created_at":"2023-04-18T14:00:00Z"
  },
  {
    "id":3,
    "title":"Receita de bolo de chocolate",
    "content":"Para fazer um delicioso bolo de chocolate, você vai precisar de farinha de trigo, açúcar, ovos, óleo, cacau em  e fermento em .",
    "created_at":"2023-04-18T14:00:00Z"
  }
]
"""
因此,使用3个引号("""),我们可以用母线声明一个字符串。现在,我们可以将字符串的对话与Koud0格式进行:

// Usamos o .utf8 para converter a string
// para um padrão que permita acentuação
let data = Data(jsonContent.utf8)

文件

假设我们有一个.json文件,其中包含文章列表:

[
  {
    "id":1,
    "title":"Como se tornar um programador",
    "content":"Para se tornar um programador, é necessário estudar linguagens de programação e desenvolver habilidades de resolução de problemas.",
    "created_at":"2023-04-18T14:00:00Z"
  },
  {
    "id":2,
    "title":"Os benefícios da meditação",
    "content":"A meditação pode ajudar a reduzir o estresse, melhorar a qualidade do sono e aumentar a sensação de bem-estar.",
    "created_at":"2023-04-18T14:00:00Z"
  },
  {
    "id":3,
    "title":"Receita de bolo de chocolate",
    "content":"Para fazer um delicioso bolo de chocolate, você vai precisar de farinha de trigo, açúcar, ovos, óleo, cacau em pó e fermento em pó.",
    "created_at":"2023-04-18T14:00:00Z"
  }
]

虽然我们文件的名称是koud4,但可以读取如下:

// Caminho para um arquivo
let filePath = Bundle.main.path(forResource: "artigos", ofType: "json")

// Transforma o conteúdo do arquivo em Data
let data = try? Data(contentsOf: filePath)

我们在日期引导程序之前使用了try?,因为我们文件与Data的对话可能会失败并导致异常。对于无需处理例外,我们使用try?,如果发生错误,它将使koud8返回koud9。

API的申请

要在API中提出请求,我们将使用最传统的母亲URLSession.shared.dataTask(for:)。考虑一个虚构的URL,可以为我们提供我们想要获得的文章列表,我们有以下内容:

URLSession.shared.dataTask(with: url) { (data, response, error) in
    // Verificamos se um objeto data recebido não é nulo
    guard let data else { return }

    // A partir daqui, executamos o passo de decodificação
    // ...
}.resume()

Swift类型创建

我们需要定义JSON中包含的对象的结构,该对象将被解码。为此,我们将根据Koud12协议创建一个struct。该协议可在Koud13框架中可用,用于定义可解码的对象。接下来,我们将声明我们的类型Koud14:

struct Post: Decodable {
    let id: Int
    let title: String
    let content: String
    let createdAt: String

    /* 
    *  Definição dos atributos que possuem
    *  uma chave num formato diferente no JSON
    *  ex.: Nomes em snake_case
    */
    enum CodingKeys: String, CodingKey {
        case id, title, content
        case createdAt = "created_at"
    }
}

我们的JSON中包含的对象的每个属性都定义为我们的koud11的属性。通过koud16 koud17,我们可以定义关键之间的关联,以从JSON重命名为我们对象的属性。例如,在上面,我们将koud18(以 snake-case )转换为koud19(ins camel-case )。可以通过将JSONDecoderkeyDecodingStrategy属性归因于.convertFromSnakeCasekeyDecodingStrategy属性获得相同的行为,这将在当前的补品中看到。使用此属性的使用消除了定义 snake-case

格式的每个属性的关联的需求

通过定义我们的 struct ,我们可以为他进行其他结构的解码,例如JSON,这是我们的目标。

Decodificaã§o

现在,我们已经有了一个Data对象和一个定义的类型,我们可以使用它们来解码我们的JSON所包含。为此, framework Foundation提供了为此目标创建的JSONDecoder类。下面我们有一个解码过程的示例:

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let artigos = try? decoder.decode([Post].self, from: data)

print(artigos)

母亲©JSONDecoder类的所有decode收到两个部分。第一个是要解码的对象的类型,第二个是包含先前数据的Data对象。

在本文的示例中,解码的类型是Post列表。 self用于获得预期类型,即[Post]Post的一个 array )。

值得注意的是,预期的Data不能无效且无效,请确保其对象data在传递给decode之前不是koud9。

包括£o

知道这三种在Swift中解码JSON的基本方法已经为您提供了足够的依据,可以将概念应用于各种情况。下面,本文中使用的一些资源的文档:

您喜欢这篇文章吗?分享并关注我以获取更多这样的遏制!

capa por Ferenc Almasi Unsplash