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 | Also known as the canonical format, this JSON representation avoids loss of
BSON type information. This format prioritizes type preservation at the loss of human-readability and
interoperability with older formats. |
Modo relaxado | JSON representation that describes BSON documents with some type information loss. This format prioritizes human-readability and interoperability at the loss of
certain type information. |
Shell | JSON representation that matches the syntax used in the MongoDB shell. This format prioritizes compatibility with the MongoDB shell, which often uses
JavaScript functions to represent types. |
Strict | Deprecated. This representation is the legacy format that fully conforms to
the JSON RFC which allows any JSON parser to read the type information. |
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 $uuid
análise do campo , consulte as 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)
[ {'foo': [1, 2]}, {'bar': {'hello': 'world'}}, {'code': Code('function x() { return 1; }', {})}, {'bin': Binary(b'\x01\x02\x03\x04', 128)} ]
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, Binary from 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)
'''[ {"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": { "$code": "function x() { return 1; }", "$scope": {} }}, {"bin": { "$binary": { "base64": "AQIDBA==", "subType": "80" }}} ]'''
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, Binary from 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)
'''[ {"foo": [ {"$numberInt": "1"}, {"$numberInt": "2"} ]}, {"bar": {"hello": "world"}}, {"code": { "$code": "function x() { return 1; }", "$scope": {} }}, {"bin": { "$binary": { "base64": "AQIDBA==", "subType": "80" }}} ]'''
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
.