Overview
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.
Formatos JSON extendidos
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:
Documentación oficial deJSON RFC
Entrada manualdel servidor JSON extendido de MongoDB
Documentación de la APIBSON_SUBTYPE_UUID
EspecificaciónJSON extendida en GitHub
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
Utilice funciones BSON
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().
Utilice el lector BSON 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:
Escribir JSON extendido
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().
Documentación de la API
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: