Parsing JSON com Codable e Alamofire

Andrew Castro
Aug 12, 2019 · 6 min read
Image for post
Image for post

Introdução

Há algum tempo, o JSON se tornou o formato mais usado para transferir dados. É muito comum o desenvolvedor trabalhar com dados JSON, por isso este artigo tem a finalidade de mostrar como usar o Alamofire para gerenciar a camada de serviço e o Codable para decodificar o response.

O JSON (JavaScript Object Notation), basicamente, é um modelo de formato em texto para armazenamento e troca de informações entre sistemas de uma forma bem compacta.

O Codable foi adicionado ao Swift 4 como uma forma de permitir que os objetos se convertam em uma apresentação externa. Codable é um protocolo que em si é um typealias de Decodable e Encodable.

Ao usá-lo, pode-se modelar o JSONObject em Struct ou Classes. Não é preciso escrever o construtor, tudo é entregue pelo Codable. O que deve ser feito é estender o modelo para estar em conformidade com o protocolo.

Já o Alamofire é uma biblioteca HTTP Networking baseada em Swift para iOS e MacOS. Fornece métodos de request/response, parâmetros JSON e serialização de response, autenticação e muitos outros recursos.

A melhor coisa do Alamofire é que ele foi escrito 100% em Swift. Sua documentação é bem detalhada e não deixa nenhuma dúvida quanto à implementação de qualquer tipo de recurso que você queira utilizar e de que possa oferecer.

Camada de serviço — Alamofire

O JSON será obtido através de uma url, que estará mockado. “Mockar” significa que haverá uma simulação de um objeto real que pode ser manipulado no dia a dia. Assim, pode-se ter o controle do objeto para ajustar algum comportamento no aplicativo, realizar testes, etc.

Pode-se usar o mocky.io justamente para para gerar um objeto customizado(mock) podendo alterar o status code da resposta, o content type e body.

https://www.mocky.io/v2/5d3ee2a52f00000e006d0058

Abaixo, verifica-se a classe de serviço para obter o JSON. Nela será utilizado o Alamofire.

final class AppService {    private var alamofireManager: Alamofire.SessionManager
private var url: String = “”
init(_ url: String, timeout: TimeInterval = 15) {
self.url = url
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = timeout
configuration.timeoutIntervalForResource = timeout
alamofireManager = Alamofire.SessionManager(configuration:configuration)
}
func getFromServer(completionHandler: @escaping(_ articleContent: ArticleContent?, _ error: String?) -> Void) {
alamofireManager.request(self.url).validate(statusCode: 200..<300).validate(contentType: [“application/json”]).responseJSON { response in
switch response.result {
case .success:
guard let jsonData = response.data, let value = response.value, let articleContent = try? JSONDecoder().decode(ArticleContent.self, from: jsonData) else {
fallthrough
}
print(“Título do artigo: \(articleContent.title ?? “”), linguagem utilizada: \(articleContent.language ?? “”)”)
print(value)
completionHandler(articleContent, nil)
case .failure:
completionHandler(nil, “Erro! Tente novamente”)
}
}
}
}

Essa classe de serviço contém alguns detalhes bem interessantes. O primeiro deles é o session manager, que será responsável pela criação e gerenciamento de objetos request.

O timeoutIntervalForRequest determina o intervalo de tempo limite da solicitação para todas as tarefas nas sessões com base nessa configuração. O intervalo de tempo limite da solicitação controla por quanto tempo (em segundos) uma tarefa deve aguardar a chegada de dados adicionais antes de desistir. O tempo default é 60 segundos.

O timeoutIntervalForResource determina o intervalo de tempo limite do recurso para todas as tarefas dentro de sessões com base nessa configuração. O intervalo de tempo limite do recurso controla por quanto tempo (em segundos) aguardar que um recurso inteiro seja transferido antes de desistir. O tempo default é 7 dias.

Já o .request cria um DataRequest para recuperar o conteúdo da URL especificada. Caso tenha algum parâmetro ou header especificado, também irá recuperar.

O .validate valida (really?!) que o response tem um código de status na sequência especificada.

Ao usar o JSONDecoder().decode, iremos retornar um valor do tipo que é especificado, decodificado de um objeto JSON. Para isso, a model precisa estar em conformidade com o protocolo Codable. Dessa forma, a estrutura da model irá ficar conforme descrita abaixo.

Info.plist

Caso o projeto a ser desenvolvido use um protocolo de comunicação não seguro (sem ‘https’), acesse o info.plist localizado na raiz do projeto e adicione as seguintes configurações:

Image for post
Image for post

Basta clicar no botão + localizado ao lado da linha 'Information Property List', e adicionar as Property List Key 'App Transport Security Settings' e 'Allow Arbitrary Loads'.

O App Transport Security Setting é descrição das alterações feitas na segurança padrão para conexões HTTP. E o Allow Arbitrary Loads indica se as restrições de Segurança de Transporte do Aplicativo estão desabilitadas para todas as conexões de rede através do valor booleano, YES (true) e NO (false).

Camada Model — Codable

struct ArticleContent: Codable {
var title: String?
var language: String?
var platform: String?
var technology: [Technology]?
}
struct Technology: Codable {
var name: String?
var type: String?
var documentation: String?
}

Vale ressaltar que nem sempre o nome das propriedades do JSON virão da maneira desejada (nesse caso, a variável declarada pode ter um nome diferente da propriedade do objeto). A maioria dos projetos costuma ter padrões em suas classes modelos, usando os nomes das variáveis em Inglês. Mas, o JSON pode ter propriedades com nome em Português ou pode vir com algum caracter especial. Nesse último caso, basta utilizar o Coding Key. Através deste, será possível alterar o nome da key para criar um mapeamento entre nomes das variáveis da classe e os nomes das propriedades do JSON.

struct ArticleContent: Codable {
var title: String?
var language: String?
var platform: String?
var technology: [Technology]?

enum CodingKeys: String, CodingKey {
case title = “titulo”
case language = “linguagem”
case platform = “plataforma”
case technology = “tecnologia”
}
}

Como foi falado, não é preciso de construtores já que o Codable o entrega. Quando a model estiver em conformidade com o protocolo, basta verificar se o response.data não está nil e fazer o decode. Depois, será exibido a propriedade que se refere ao título do artigo, linguagem utilizada e a estrutura completa do JSON. Buildando o projeto será obtido esses dados:

Image for post
Image for post

Pode-se ver que o título do artigo e a linguagem utilizada tem os mesmo valores do JSON e a sua estrutura é a mesma!

Lembrando que é possível usar uma closure com o @escaping, como foi feito na função getFromServer. Nesse caso, irá conter um parâmetro do tipo da model(ArticleContent) para ser tratado em uma camada especifica da arquitetura que estiver sendo usada no projeto e um do tipo String para ilustrar um possível erro.

Conclusão

Foi possível ver uma maneira bem comum e fácil de se utilizar o Alamofire com Codable. Muitos projetos necessitam fazer esse tipo de operação, e entender o que foi abordado é essencial para o domínio do que foi proposto no artigo.

Ao utilizar Codable, serão poupadas linhas de código na model, já que não se utilizará frameworks que fazem o mesmo que o Codable faz.

Meu nome é Andrew Castro, sou Desenvolvedor iOS e busco sempre aprender e compartilhar conhecimento com todos. Sou da filosofia que você deve fazer tudo por paixão e diversão.

Caso tenha alguma dúvida, é só comentar comentários ou entrar em contato por aqui. Abraço!

Image for post
Image for post

A Mobicare e a Akross combinam os Melhores Talentos, Tecnologias de Ponta, Práticas Agile e DevOps com Capacidades Operacionais avançadas para ajudar Operadoras Telecom e grandes empresas a gerarem novas receitas e a melhorarem a experiência dos seus próprios clientes.

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito!

Faça parte do nosso time. 😉

mobicareofficial

Se você gosta de inovar, trabalhar com tecnologia de ponta…

Andrew Castro

Written by

iOS Developer For Fun

mobicareofficial

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito! Vem trabalhar com a gente 😉 bit.ly/mobicarreiras

Andrew Castro

Written by

iOS Developer For Fun

mobicareofficial

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito! Vem trabalhar com a gente 😉 bit.ly/mobicarreiras

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store