Visão geral
JSON é um formato de dados que representa os valores de objetos, arrays, números, strings, booleans e nulos. O formato Extended JSON define um conjunto reservado de chaves prefixadas com "$" para representar informações de tipos de campos que correspondem diretamente a cada tipo em BSON, o formato usado pelo MongoDB para armazenar dados.
Formatos Extended JSON
O MongoDB Extended JSON oferece diferentes formatos de string para representar dados BSON. Cada um dos formatos está em conformidade com o JSON RFC e atende a casos de uso específicos. O formato estendido, também conhecido como o formato canônico, oferece representações específicas para cada tipo de BSON para fazer conversão bidirecional sem perda de informações. O formato modo Relaxed é mais conciso e semelhante ao JSON comum, mas não representa todas as informações de tipo, como o tamanho de byte específico de campos numéricos.
Consulte a tabela a seguir para ver uma descrição de cada formato:
Nome | Descrição |
|---|---|
Extended | Também conhecido como o formato canônico, essa representação do JSON evita a perda de informações do tipo de BSON. |
Modo relaxado | Representação JSON que descreve documentos BSON com algum tipo de perda de informação. |
Shell | Representação JSON que corresponde à sintaxe usada no MongoDB shell. |
Strict | Obsoleto. Essa representação é o formato legado que está totalmente em conformidade com o JSON RFC que permite a qualquer analisador JSON ler as informações de tipos. |
Observação
O driver analisa o tipo de JSON estendido $uuid de uma string para um objeto BsonBinary de subtipo binário 4. Para obter mais informações sobre a análise do campo $uuid, consulte a seção regras especiais para analisar campos $uuid na especificação de JSON estendida.
Para saber mais sobre JSON, BSON e Extended JSON, consulte nosso artigo sobre JSON, BSON e Extended JSON no manual do MongoDB Server .
Exemplos de JSON estendido
Os exemplos abaixo mostram um documento contendo um campo de ObjectId, data e número longo representado em cada formato Extended JSON. Clique na aba correspondente ao formato do exemplo que deseja ver:
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": { "$numberLong": "1601499609" }}, "numViews": { "$numberLong": "36520312" }}{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": "2020-09-30T18:22:51.648Z" }, "numViews": 36520312}{ "_id": ObjectId("573a1391f29313caabcd9637"), "createdAt": ISODate("2020-09-30T18:22:51.648Z"), "numViews": NumberLong("36520312")}{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": 1601499609 }, "numViews": { "$numberLong": "36520312" }}Ler Extended JSON
Você pode ler uma string de Extended JSON em um objeto Python chamando o método bson.json_util.loads(). Este método analisa uma string de JSON estendida e retorna uma lista Python contendo os dados.
O exemplo seguinte mostra como você pode ler uma string de Extended JSON em uma lista de dicionários utilizando o método loads():
from bson.json_util import loads
ejson_str = '''[ {"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": { "$scope": {}, "$code": "function x() { return 1; }" }}, {"bin": { "$type": "80", "$binary": "AQIDBA==" }}]'''
doc = loads(ejson_str)print(doc)Aviso
Valide entradas não confiáveis antes de converter JSON em BSON
Se você converter uma string JSON para BSON e usar o BSON resultante em uma query, atualizar ou comando, um invasor pode injetar operadores ou valores de campo inesperados que alteram o significado da operação. Esse risco é maior quando o JSON se origina de um usuário, uma solicitação de API ou outra fonte não confiável.
Para aprender mais sobre como validar a entrada antes da conversão, consulte Validar entrada não confiável antes de converter JSON em BSON.
Lendo valores binários no Python 2
No Python 3, o driver decodifica valores binários JSON com subtipo 0 para instâncias da classe bytes. No Python 2, o driver decodifica esses valores para instâncias da classe Binary com subtipo 0.
Os exemplos de código a seguir mostram como o PyMongo decodifica instâncias binárias JSON com subtipo 0. Selecione a aba Python 2 ou Python 3 para visualizar o código correspondente:
from bson.json_util import loads
doc = loads('{"b": {"$binary': b'this is a byte string'})print(doc){u'b': Binary('this is a byte string', 0)}from bson.json_util import loads
doc = loads('{"b": {"$binary': b'this is a byte string'})print(doc){'b': b'this is a byte string'}Escrever JSON estendido
Você pode gravar uma string de JSON estendida a partir de uma lista de dicionários chamando o método bson.json_util.dumps(). O exemplo a seguir gera uma string de Extended JSON no formato Relaxed:
from bson import Code, Binaryfrom bson.json_util import dumps
doc = [ {'foo': [1, 2]}, {'bar': {'hello': 'world'}}, {'code': Code('function x() { return 1; }', {})}, {'bin': Binary(b'\x01\x02\x03\x04', 128)}]
ejson_str = dumps(doc)print(ejson_str)Por padrão, o método dumps() retorna a string de JSON estendida no formato relaxado. Para especificar um formato diferente, passe um dos seguintes valores para o parâmetro json_options:
CANONICAL_JSON_OPTIONS: retorna a string de JSON estendida no formato canônico.LEGACY_JSON_OPTIONS: retorna a string de JSON estendida no formato legado. Recomendamos usar o formato Relaxed ou Canonical.
O exemplo a seguir mostra como gerar JSON estendido no formato canônico:
from bson import Code, Binaryfrom bson.json_util import dumps, CANONICAL_JSON_OPTIONS
doc = [ {'foo': [1, 2]}, {'bar': {'hello': 'world'}}, {'code': Code('function x() { return 1; }', {})}, {'bin': Binary(b'\x01\x02\x03\x04', 128)}]
ejson_str = dumps(doc, json_options=CANONICAL_JSON_OPTIONS)print(ejson_str)Informações adicionais
Os recursos nas seções a seguir fornecem mais informações sobre como trabalhar com JSON estendido.
Documentação da API
Para obter mais informações sobre os métodos e tipos em bson.json_util, consulte a seguinte documentação da API:
Outros pacotes
python-bsonjs é outro pacote, criado sobre libbson, que pode converter BSON em Extended JSON. O pacote python-bsonjs não depende do PyMongo e pode oferecer uma melhoria de desempenho em relação ao json_util em determinados casos.
Dica
Usar o tipo de documento RawBSONDocument
python-bsonjs funciona melhor com o PyMongo ao converter do tipo RawBSONDocument.