语境
对于那些开始的人,也许想知道:为什么我需要知道如何在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 pó e fermento em pó.",
"created_at":"2023-04-18T14:00:00Z"
}
]
"""
"""
),我们可以用母线声明一个字符串。现在,我们可以将字符串的对话与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 )。可以通过将JSONDecoder
的keyDecodingStrategy
属性归因于.convertFromSnakeCase
的keyDecodingStrategy
属性获得相同的行为,这将在当前的补品中看到。使用此属性的使用消除了定义 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