Como analisar JSON em Python

Aqui vamos guiá-lo através do processo de importação de json e usá-lo para analisar JSON em Python, com uma útil tabela de transformação JSON-Python. Quer seja um programador de Python experiente ou esteja apenas a começar, este tutorial passo-a-passo ensina como analisar JSON como um profissional!
12 min read
How to parse JSON data with Python

Neste tutorial, verá:

Uma introdução a JSON em Python

Antes de nos aprofundarmos na análise de JSON com Python, vamos entender o que é JSON e como usá-lo em Python.

O que é JSON?

JSON, abreviatura de JavaScript Object Notation, é um formato leve de intercâmbio de dados. É simples para os humanos lerem e escreverem e fácil para as máquinas analisarem e gerarem. Isso o torna um dos formatos de dados mais populares. Especificamente, o JSON tornou-se a “linguagem da web” porque é normalmente utilizado para transmitir dados entre servidores e aplicações web através de APIs.

Aqui está um exemplo de JSON:


{
  "name": "Maria Smith",
  "age": 32,
  "isMarried": true,
  "hobbies": ["reading", "jogging"],
  "address": {
    "street": "123 Main St",
    "city": "San Francisco",
    "state": "CA",
    "zip": "12345"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "555-555-1234"
    },
    {
      "type": "work",
      "number": "555-555-5678"
    }
  ],
  "notes": null
}

Como pode ver, o JSON é constituído por pares de valores chave. Cada chave é uma cadeia de caracteres e cada valor pode ser uma cadeia de caracteres, um número, um booleano, um nulo, uma matriz ou um objeto. Embora seja semelhante a um objeto JavaScript, o JSON pode ser utilizado com qualquer linguagem de programação, incluindo Python.

Como lidar com JSON em Python

O Python suporta nativamente JSON através do módulo json, que faz parte da Biblioteca Padrão do Python. Isso significa que você não precisa instalar nenhuma biblioteca adicional para trabalhar com JSON em Python. Pode importar json da seguinte forma:

import json

A biblioteca Python json incorporada expõe uma API completa para lidar com JSON. Em particular, tem duas funções-chave: loads e load. A função loads permite-lhe analisar dados JSON a partir de uma cadeia de caracteres. Note-se que, apesar de o seu nome parecer estar no plural, a terminação “s” significa “string” (cadeia). Por isso, deve ser lido como “load-s”. Por outro lado, a função load destina-se a analisar os dados JSON em bytes.

Através desses dois métodos, o json oferece a capacidade de converter dados JSON em objetos Python equivalentes, como dicionários e listas, e vice-versa. Além disso, o módulo json permite-lhe criar codificadores e descodificadores personalizados para lidar com tipos de dados específicos.

Continue lendo e descubra como usar a biblioteca json para analisar dados JSON em Python!

Analisar dados JSON com Python

Vamos dar uma olhadela a alguns exemplos do mundo real e aprender a analisar dados JSON de diferentes fontes em diferentes estruturas de dados Python.

Converter uma cadeia de caracteres JSON para um dicionário Python

Suponha que tem alguns dados JSON armazenados numa cadeia de caracteres e que pretende convertê-los num dicionário Python. Este é o aspeto dos dados JSON:


{
  "name": "iPear 23",
  "colors": ["black", "white", "red", "blue"],
  "price": 999.99,
  "inStock": true
}

E esta é a sua representação em Python:

smartphone_json = '{"name": "iPear 23", "colors": ["black", "white", "red", "blue"], "price": 999.99, "inStock": true}'

Considere o uso da convenção de aspas triplas do Python para armazenar longas cadeias de caracteres JSON de várias linhas.

Pode verificar se o smartphone contém uma cadeia Python válida com a linha abaixo:

print(type(smartphone))

Isso imprimirá:

<class 'str'>

str significa “string” (cadeia) e significa que a variável de smartphone tem o tipo de sequência de texto.

Analise a cadeia JSON contida no smartphone para um dicionário Python com o método json.loads() da seguinte forma:

import json

# JSON string
smartphone_json = '{"name": "iPear 23", "colors": ["black", "white", "red", "blue"], "price": 999.99, "inStock": true}'
# from JSON string to Python dict
smartphone_dict = json.loads(smartphone_json)

# verify the type of the resulting variable
print(type(smartphone_dict)) # dict

Se você executar este trecho, obterá:

<class 'dict'>

Fantástico! smartphone_dict agora contém um dicionário Python válido!

Assim, tudo o que você precisa fazer para converter uma cadeia JSON em um dicionário Python é passar uma cadeia JSON válida para json.loads()

Agora você pode aceder aos campos de dicionário resultantes como de costume:

product = smartphone_dict['product'] # smartphone
priced = smartphone['price'] # 999.99
colors = smartphone['colors'] # ['black', 'white', 'red', 'blue']

Lembre-se de que a função json.loads() nem sempre retornará um dicionário. Especificamente, o tipo de dados devolvido depende da cadeia de entrada. Por exemplo, se a cadeia JSON contiver um valor plano, será convertida para o valor primitivo Python correspondente:

import json
 
json_string = '15.5'
float_var = json.loads(json_string)

print(type(float_var)) # <class 'float'>

Da mesma forma, uma cadeia JSON contendo uma lista de matrizes se tornará uma lista de Python:


import json
 
json_string = '[1, 2, 3]'
list_var = json.loads(json_string)
print(json_string) # <class 'list'>

Dê uma olhada na tabela de conversão abaixo para ver como os valores JSON são convertidos em dados Python por json:

Valor JSON

 
Dados Python

 

string

str
number (integer) int
number (real) float
true True
false

False

null

None

array list
object dict

Transformar uma resposta JSON da API em um dicionário de Python

Considere que precisa criar uma API e converter a sua resposta JSON num dicionário de Python. No exemplo abaixo, chamaremos o seguinte ponto de extremidade da API do projeto {JSON} Placeholder para obter alguns dados JSON falsos:

https://jsonplaceholder.typicode.com/todos/1

Essa API RESTFul devolve a resposta JSON abaixo:

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

Pode chamar essa API com o módulo urllib da biblioteca padrão e converter o JSON resultante num dicionário de Python da seguinte forma:

import urllib.request
import json

url = "https://jsonplaceholder.typicode.com/todos/1"

with urllib.request.urlopen(url) as response:
     body_json = response.read()

body_dict = json.loads(body_json)
user_id = body_dict['userId'] # 1

urllib.request.urlopen() efetua a chamada à API e devolve um objeto HTTPResponse. O seu método read() é então utilizado para obter o corpo da resposta body_json, que contém a resposta da API como uma cadeia JSON. Finalmente, essa cadeia de caracteres pode ser analisada em um dicionário de Python através de json.loads(), conforme explicado anteriormente.

Do mesmo modo, é possível obter o mesmo resultado com requests:

import requests
import json

url = "https://jsonplaceholder.typicode.com/todos/1"
response = requests.get(url)

body_dict = response.json()
user_id = body_dict['userId'] # 1

Note que o método .json() transforma automaticamente o objeto de resposta contendo dados JSON na respectiva estrutura de dados Python.

Ótimo! Agora já sabe como analisar uma resposta JSON de API em Python com urllib e requests.

Carregar um ficheiro JSON para um dicionário de Python

Suponha que tem alguns dados JSON armazenados num ficheiro smartphone.json, como se segue:

{
  "name": "iPear 23",
  "colors": ["black", "white", "red", "blue"],
  "price": 999.99,
  "inStock": true,
  "dimensions": {
    "width": 2.82,
    "height": 5.78,
    "depth": 0.30
  },
  "features": [
    "5G",
    "HD display",
    "Dual camera"
  ]
}

Seu objetivo é ler o ficheiro JSON e carregá-lo para um dicionário de Python. Consiga-o com o trecho abaixo:

import json

with open('smartphone.json') as file:
  smartphone_dict = json.load(file)

print(type(smartphone_dict)) # <class 'dict'>
features = smartphone_dict['features'] # ['5G', 'HD display', 'Dual camera']

open() integrada permite-lhe carregar um ficheiro e obter o seu objeto de ficheiro correspondente. O método json.read() desserializa então o ficheiro de texto ou o ficheiro binário que contém um documento JSON para o objeto de Python equivalente. Neste caso, smartphone.json torna-se num dicionário de Python.

Perfeito, analisar um ficheiro JSON em Python requer apenas algumas linhas de código!

De dados JSON para um objeto de Python personalizado

Agora, você deseja analisar alguns dados JSON em uma classe de Python personalizada. Esta é a aparência da sua classe de Python de Smartphone personalizada:


class Smartphone:
    def __init__(self, name, colors, price, in_stock):
        self.name = name    
        self.colors = colors
        self.price = price
        self.in_stock = in_stock

Aqui, o objetivo é converter a seguinte cadeia de caracteres JSON numa instância de Smartphone:

{
  "name": "iPear 23 Plus",
  "colors": ["black", "white", "gold"],
  "price": 1299.99,
  "inStock": false
}

Para realizar essa tarefa, você precisa criar um decodificador personalizado. Em pormenor, é necessário estender a classe JSONDecoder e definir o parâmetro object_hook no método __init__. Atribua-lhe o nome do método da classe que contém a lógica de análise personalizada. Nesse método de análise, pode utilizar os valores contidos no dicionário padrão devolvido por json.read() para instanciar um objeto Smartphone.

Defina um SmartphoneDecoder personalizado como se segue:

import json
 
class SmartphoneDecoder(json.JSONDecoder):
    def __init__(self, object_hook=None, *args, **kwargs):
        # set the custom object_hook method
        super().__init__(object_hook=self.object_hook, *args, **kwargs)

    # class method containing the 
    # custom parsing logic
    def object_hook(self, json_dict):
        new_smartphone = Smartphone(
            json_dict.get('name'), 
            json_dict.get('colors'), 
            json_dict.get('price'),
            json_dict.get('inStock'),            
        )

        return new_smartphone

Note que deve utilizar o método get() para ler os valores do dicionário no método object_hook() personalizado. Isso garantirá que nenhum KeyErrorseja gerado se uma chave estiver faltando no dicionário. Em vez disso, será devolvido o valor None.

Agora pode passar a classe SmartphoneDecoder para o parâmetro cls em json.loads() para converter uma cadeia JSON num objeto Smartphone:

import json

# class Smartphone:
# ...

# class SmartphoneDecoder(json.JSONDecoder): 
# ...

smartphone_json = '{"name": "iPear 23 Plus", "colors": ["black", "white", "gold"], "price": 1299.99, "inStock": false}'

smartphone = json.loads(smartphone_json, cls=SmartphoneDecoder)
print(type(smartphone)) # <class '__main__.Smartphone'>
name = smartphone.name # iPear 23 Plus

Do mesmo modo, pode utilizar SmartphoneDecoder com json.load():

smartphone = json.load(smartphone_json_file, cls=SmartphoneDecoder)

Et voilà! Agora já sabe como analisar dados JSON em objetos Python personalizados!

Dados Python para JSON

Também pode fazer o caminho inverso e converter estruturas de dados e primitivas Python para JSON. Isto é possível graças às funções json.dump() e json.dumps(), que seguem a tabela de conversão abaixo:

Dados Python

 
Valor JSON

 
str string 
int number (integer)
float number (real)
True true
False  false
None  null 
list array
dict object
Null  Nenhum

json.dump() permite-lhe escrever uma cadeia JSON num ficheiro, como no exemplo seguinte:

import json

user_dict = {
    "name": "John",
    "surname": "Williams",
    "age": 48,
    "city": "New York"
}

# serializing the sample dictionary to a JSON file
with open("user.json", "w") as json_file:
    json.dump(user_dict, json_file)

Esse trecho serializará a variável user_dict de Python no ficheiro user.json.

De forma semelhante, json.dumps() converte uma variável de Python para a sua cadeia JSON equivalente:

import json

user_dict = {
    "name": "John",
    "surname": "Williams",
    "age": 48,
    "city": "New York"
}

user_json_string = json.dumps(user_dict)

print(user_json_string)

Execute este trecho e obterá:

Esta é exatamente a representação JSON do dict de Python.

Note que também pode especificar um codificador personalizado, mas mostrar como o fazer não é o objetivo deste artigo. Siga a documentação oficial para saber mais.

O módulo padrão json é o melhor recurso para analisar JSON em Python?

Tal como acontece em geral com a análise de dados, a análise em JSON apresenta desafios que não podem ser ignorados. Por exemplo, no caso de um JSON inválido, quebrado ou não-padrão, o módulo de Python json não seria suficiente.

Além disso, é necessário ter cuidado ao analisar dados JSON de fontes não fiáveis. Isto deve-se ao facto de uma cadeia de caracteres JSON maliciosa poder fazer com que o seu analisador se avarie ou consuma uma grande quantidade de recursos. Este é apenas um dos desafios que um analisador Python de JSON deve ter em conta.

Pode introduzir uma lógica personalizada para lidar com estes casos específicos. Ao mesmo tempo, isso pode demorar demasiado tempo e resultar num código complexo e pouco fiável. Por este motivo, deve considerar uma ferramenta comercial que facilite a análise de JSON, como o IDE para Raspador da Web.

 

O IDE para Raspagem da Web foi concebido especificamente para programadores e inclui uma vasta gama de funcionalidades para analisar conteúdos JSON e muito mais. Esta ferramenta pode poupar-lhe imenso tempo e ajudá-lo a proteger o seu processo de análise de JSON. Além disso, inclui as capacidades de proxy de desbloqueio da Bright Data para chamar APIs JSON de forma anónima.

Se estiver com pressa, poderá também estar interessado na nossa oferta de Dados como Serviço. Através deste serviço, pode pedir à Bright Data que lhe forneça um conjunto de dados personalizado que se adapte às suas necessidades específicas. A Bright Data cuidará de tudo, desde o desempenho até a qualidade dos dados.

 

Analisar dados JSON nunca foi tão fácil!

Conclusão

Python permite-lhe analisar nativamente dados JSON através do módulo padrão json. Isto expõe uma poderosa API para serializar e desserializar conteúdo JSON. Especificamente, oferece os métodos json.read() e json.reads() para lidar com ficheiros JSON e cadeias de caracteres JSON, respetivamente. Aqui, viu como utilizá-los para analisar dados JSON em Python com vários exemplos do mundo real. Ao mesmo tempo, compreendeu também as limitações desta abordagem. É por isso que pode querer experimentar uma solução comercial de ponta, com todas as funcionalidades para análise de dados, como o IDE para Raspador da Web de Bright Data.