Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver Pymongo
/

Extended JSON

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.

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 .

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" }
}

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)}
]

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'}

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"
}}}
]'''

Os recursos nas seções a seguir fornecem mais informações sobre como trabalhar com JSON estendido.

Para obter mais informações sobre os métodos e tipos em bson.json_util, consulte a seguinte documentação da API:

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.

Voltar

BSON

Nesta página