Overview
En esta guía, puede aprender a utilizar el formato de datos JSON extendido cuando interactúe con documentos de MongoDB.
JSON es un formato de datos legible por humanos que representa los valores de objetos, arreglos, números, cadenas, booleanos y nulos. Este formato solo admite un subconjunto de tipos de datos BSON, que es el formato que utiliza MongoDB para almacenar datos. El formato Extended JSON admite más BSON types, definiendo un conjunto reservado de claves con el prefijo "$" para representar información del tipo de campo que corresponde directamente a cada tipo en BSON.
Para obtener más información sobre JSON, BSON y JSON extendido, consulta el recurso JSON y BSON y la entrada del manual JSON extendido de MongoDB Server.
Formatos JSON extendidos
MongoDB Extended JSON proporciona formatos de string para representar datos BSON. Cada formato cumple con la RFC JSON y satisface casos de uso específicos.
La siguiente tabla describe cada formato JSON extendido:
Nombre | Descripción |
|---|---|
Extendido o Canónico | Un formato de string que evita la pérdida de información de tipo BSON durante las conversiones de datos. |
Relajado | Un formato de string que describe documentos BSON con cierta pérdida de información de tipo. |
Shell | Un formato de string que coincide con la sintaxis utilizada en el shell de MongoDB. |
Nota
El driver Ruby analiza el tipo Extended JSON $uuid de una string a un objeto BSON::Binary de subtipo binario 4. Para obtener más información sobre el análisis de campos de $uuid, consulta la sección Normas especiales para el análisis de campos $uuid en la especificación extendida de JSON.
Ejemplos de JSON extendido
Los siguientes ejemplos muestran un documento que contiene un campo ObjectId, una fecha y un número largo representado en cada formato Extendido de JSON. Haz clic en la pestaña que corresponda al formato del ejemplo que desees 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") }
Leer JSON extendido
Puedes leer una string JSON extendida en un arreglo Ruby llamando al método BSON::ExtJSON.parse. Este método analiza una string JSON extendida y devuelve un arreglo que contiene los datos.
El siguiente ejemplo muestra cómo se puede leer una string de Extended JSON en un arreglo de hashes usando el método parse:
require 'bson' ex_json = '''[ {"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": { "$scope": {}, "$code": "function x() { return 1; }" }}, {"bin": { "$type": "80", "$binary": "AQIDBA==" }} ]''' doc = BSON::ExtJSON.parse(ex_json) puts doc.class puts doc
Advertencia
Validar la entrada no confiable antes de convertir JSON a BSON.
Si convierte una string JSON a BSON y utiliza el BSON resultante en una query, una actualización o un comando, un atacante puede inyectar operadores o valores de campo inesperados que cambian el significado de la operación. Este riesgo es mayor cuando el JSON procede de un usuario, una solicitud de API o de otra fuente que no sea de confianza.
Para obtener más información sobre cómo validar la entrada antes de la conversión, consulte Validar la entrada no confiable antes de convertir JSON a BSON.
Guardar Extended JSON
Puedes guardar una cadena Extended JSON utilizando el método as_extended_json. Por defecto, este método devuelve la string de JSON extendido en formato canónico, pero puedes especificar formatos relajados o heredados pasando un argumento mode.
Nota
Versión heredada
La opción de formato heredado indica al driver de Ruby que serialice los BSON types con el formato MongoDB Extended JSON v1, que es anterior a los formatos actuales relajados y canónicos.
Para obtener más información, consulta la página MongoDB Extended JSON v1 en el Manual del servidor.
El método as_extended_json está disponible para varios tipos del núcleo y de la librería estándar, incluidos Array y Hash. El siguiente ejemplo crea cadenas Extended JSON en los formatos canónico, relajado y heredado, a partir de un arreglo de hash:
require 'bson' hash_array = [ { "foo" => [1, 2] }, { "bin" => BSON::Binary.new("\x01\x02\x03\x04", :user) }, { "number" => BSON::Int64.new(42) } ] json_string_canonical = hash_array.as_extended_json json_string_relaxed = hash_array.as_extended_json(mode: :relaxed) json_string_legacy = hash_array.as_extended_json(mode: :legacy) puts "canonical:\t #{json_string_canonical}" puts "relaxed:\t #{json_string_relaxed}" puts "legacy:\t\t #{json_string_legacy}"
Información Adicional
Para obtener más información, consulta los siguientes recursos: