Docs Menu
Docs Home
/ /

Trabajar con datos JSON extendidos

En esta guía, puede aprender a utilizar el formato JSON extendido en el controlador C.

JSON es un formato de datos que representa los valores de objetos, matrices, números, cadenas, valores booleanos y valores nulos. Este formato solo admite un subconjunto de tipos de datos BSON, que es el formato que MongoDB utiliza para almacenar datos. El formato JSON extendido admite más tipos BSON y 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.

Para obtener más información sobre la diferencia entre estos formatos, consulte la Recurso JSON y BSON.

MongoDB Extended JSON ofrece diferentes formatos de cadena para representar datos BSON. Cada uno de estos formatos cumple con la RFC de JSON y satisface casos de uso específicos.

La siguiente tabla describe 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

Deprecated. 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.
The legacy API uses this format.

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.
The legacy API uses this format.

Nota

El controlador analiza el $uuid tipo JSON extendido de una cadena a datos binarios con el subtipo 4 BSON_SUBTYPE_UUID(). Para obtener más información sobre el $uuid análisis del campo, consulte las reglas especiales para el análisis de campos $uuid.

Para obtener información más detallada sobre estos formatos, consulte los siguientes recursos:

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

Puede leer una cadena JSON extendida en un documento BSON llamando a la función bson_new_from_json(). Esta función analiza la cadena JSON extendida y devuelve una estructura bson_t que contiene los datos.

El siguiente ejemplo muestra cómo puedes leer una cadena JSON extendida de ejemplo en un documento bson_t:

/* Read Extended JSON string to BSON */
const char *ejson_str = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"},"
"\"myNumber\": {\"$numberLong\": \"4794261\" }}";
bson_error_t error;
bson_t *doc = bson_new_from_json ((const uint8_t *)ejson_str, -1, &error);

Para obtener más información, consulte la documentación de la API bson_new_from_json() y bson_as_canonical_extended_json().

También puede analizar cadenas JSON extendidas mediante el tipo bson_json_reader_t, que proporciona una interfaz de transmisión para convertir JSON a BSON. Esto resulta especialmente útil al procesar varios documentos JSON o cuando necesita mayor control sobre el proceso de análisis.

El siguiente ejemplo de código muestra cómo puede utilizar bson_json_reader_t para convertir una cadena JSON extendida en un documento BSON:

const char *ejson_str = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"},"
"\"myNumber\": {\"$numberLong\": \"4794261\" }}";
bson_json_reader_t *reader;
bson_error_t error;
bson_t doc = BSON_INITIALIZER;
int ret;
reader = bson_json_data_reader_new (false, 0);
bson_json_data_reader_ingest (reader, (const uint8_t *)ejson_str, strlen (ejson_str));
ret = bson_json_reader_read (reader, &doc, &error);
if (ret > 0) {
bson_iter_t iter;
if (bson_iter_init (&iter, &doc)) {
while (bson_iter_next (&iter)) {
const char *key = bson_iter_key (&iter);
if (strcmp (key, "_id") == 0 && BSON_ITER_HOLDS_OID (&iter)) {
const bson_oid_t *oid = bson_iter_oid (&iter);
char oid_str[25];
bson_oid_to_string (oid, oid_str);
printf ("%s is type: ObjectId\n", oid_str);
}
if (strcmp (key, "myNumber") == 0 && BSON_ITER_HOLDS_INT64 (&iter)) {
int64_t number = bson_iter_int64 (&iter);
printf ("%ld is type: int64_t\n", (long)number);
}
}
}
} else if (ret < 0) {
printf ("Error: %s\n", error.message);
}
bson_json_reader_destroy (reader);
bson_destroy (&doc);
507f1f77bcf86cd799439011 is type: ObjectId
4794261 is type: int64_t

Para obtener más información, consulte la siguiente documentación de API:

Puedes escribir un documento BSON como una string JSON Extendida llamando a la función bson_as_json_with_opts(). Esta función convierte un documento bson_t en una string JSON Extendida con opciones para especificar el formato de salida.

El siguiente ejemplo muestra cómo crear un documento BSON y generarlo como JSON extendido en formato relajado:

bson_t *doc;
bson_oid_t oid;
bson_json_opts_t *opts;
char *json_str;
// Create a BSON document
doc = bson_new ();
bson_oid_init_from_string (&oid, "507f1f77bcf86cd799439012");
bson_append_oid (doc, "_id", -1, &oid);
bson_append_int32 (doc, "myNumber", -1, 11223344);
// Configure JSON output options for Relaxed mode
opts = bson_json_opts_new (BSON_JSON_MODE_RELAXED, BSON_MAX_LEN_UNLIMITED);
// Convert to Extended JSON
json_str = bson_as_json_with_opts (doc, NULL, opts);
printf ("%s\n", json_str);
// Cleanup
bson_free (json_str);
bson_json_opts_destroy (opts);
bson_destroy (doc);
{ "_id" : { "$oid" : "507f1f77bcf86cd799439012" }, "myNumber" : 11223344 }

Para obtener más información, consulte la documentación de la API bson_as_json_with_opts().

Para obtener más información sobre las funciones y los tipos que puede utilizar para trabajar con datos JSON extendidos, consulte la siguiente documentación de API:

Volver

BSON

En esta página