Overview
JSON es un formato de datos que representa los valores de objetos, matrices, números, cadenas, valores booleanos y nulos. El formato JSON extendido define un conjunto reservado de claves con el prefijo "$" para representar información de tipo de campo que corresponde directamente a cada tipo en BSON, el formato que MongoDB utiliza para almacenar datos.
Formatos JSON extendidos
MongoDB Extended JSON ofrece diferentes formatos de cadena para representar datos BSON. Cada formato cumple con la RFC de JSON y satisface casos de uso específicos. El formato extendido, también conocido como formato canónico, ofrece representaciones específicas para cada tipo de BSON, lo que permite una conversión bidireccional sin pérdida de información. El formato de modo relajado es más conciso y similar al JSON convencional, pero no representa toda la información de tipo, como el tamaño de bytes específico de los campos numéricos.
Consulte la siguiente tabla para ver una descripción de cada formato:
Nombre | Descripción |
|---|---|
Extendido | 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 Relajado | 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. |
Estricto | Deprecated. This representation is the legacy format that fully conforms to
the JSON RFC which allows any JSON parser to read the type information. |
Nota
El controlador analiza el $uuid tipo JSON extendido de una cadena a un BsonBinary objeto de subtipo 4 binario. Para obtener más información sobre el análisis $uuid de campos, consulte la sección "Reglas especiales para el análisis de campos $uuid" en la especificación JSON extendida.
Para obtener más información sobre JSON, BSON y JSON extendido, consulte nuestro artículo sobre JSON, BSON y JSON extendido en el manual de MongoDB Server.
Ejemplos de JSON extendidos
Los siguientes ejemplos muestran un documento que contiene un campo ObjectId, una fecha y un número largo, representados en cada formato JSON extendido. Haga clic en la pestaña correspondiente al formato del ejemplo que desea 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" } }
Leer JSON extendido
Puedes leer una string extendida de JSON en un objeto de Python llamando al método bson.json_util.loads(). Este método analiza una string extendida de JSON y devuelve una lista de Python que contiene los datos.
El siguiente ejemplo muestra cómo se puede leer una cadena JSON extendida en una lista de diccionarios utilizando el 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)} ]
Lectura de valores binarios en Python 2
En Python 3, el controlador decodifica valores binarios JSON con subtipo 0 en instancias de la clase bytes. En Python 2, el controlador decodifica estos valores en instancias de la clase Binary con subtipo 0.
Los siguientes ejemplos de código muestran cómo PyMongo decodifica instancias binarias JSON con el subtipo 0. Seleccione el Python 2 o la pestaña Python 3 para ver el código correspondiente:
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'}
Escribir JSON extendido
Puede escribir una cadena JSON extendida a partir de una lista de diccionarios llamando al método bson.json_util.dumps(). El siguiente ejemplo genera una cadena JSON extendida en formato relajado:
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" }}} ]'''
De forma predeterminada, el método dumps() devuelve la cadena JSON extendida en formato relajado. Para especificar un formato diferente, pase uno de los siguientes valores al parámetro json_options:
CANONICAL_JSON_OPTIONS: Devuelve la string Extended JSON en formato canónico.LEGACY_JSON_OPTIONSDevuelve la cadena JSON extendida en formato heredado. Recomendamos usar el formato relajado o canónico.
El siguiente ejemplo muestra cómo generar JSON extendido en 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" }}} ]'''
Información Adicional
Los recursos en las siguientes secciones proporcionan más información sobre cómo trabajar con JSON extendido.
Documentación de la API
Para obtener más información sobre los métodos y tipos en bson.json_util, consulte la siguiente documentación de API:
Otros paquetes
python-bsonjs es otro paquete, basado en libbson, que puede convertir BSON a JSON extendido. El python-bsonjs paquete no depende de PyMongo y podría ofrecer una mejora de rendimiento json_util con respecto a en ciertos casos.
Tip
Utilice el tipo RawBSONDocument
python-bsonjs Funciona mejor con PyMongo al convertir del tipo RawBSONDocument.