Análisis
Los documentos BSON se analizan de forma diferida según sea necesario. Para comenzar a analizar un documento BSON, utilice una de las funciones de Libbson proporcionadas para crear un nuevo documento. bson_t a partir de datos existentes, como bson_new_from_data. Esto creará una copia de los datos para que se puedan realizar modificaciones adicionales en el documento BSON.
Tip
Si solo desea analizar un documento BSON y no necesita mutarlo, puede usar bson_init_static para evitar hacer una copia de los datos.
bson_t *b; b = bson_new_from_data (my_data, my_data_len); if (!b) { fprintf (stderr, "The specified length embedded in <my_data> did not match " "<my_data_len>\n"); return; } bson_destroy (b);
Solo se realizan dos comprobaciones al crear un nuevo bson_t a partir de un búfer existente. Primero, el documento debe comenzar con la longitud del búfer, que coincide con lo esperado por el invocador. Segundo, el documento debe terminar con la longitud final esperada. \0 byte.
Para analizar el documento con más detalle, usamos bson_iter_t para iterar los elementos dentro del documento. Imprimimos todos los nombres de campo del documento.
bson_t *b; bson_iter_t iter; if ((b = bson_new_from_data (my_data, my_data_len))) { if (bson_iter_init (&iter, b)) { while (bson_iter_next (&iter)) { printf ("Found element key: \"%s\"\n", bson_iter_key (&iter)); } } bson_destroy (b); }
La conversión de un documento a JSON utiliza bson_iter_t y bson_visitor_t para iterar todos los campos de un documento BSON de forma recursiva y generar una8 cadena JSON codificada en UTF-.
bson_t *b; char *json; if ((b = bson_new_from_data (my_data, my_data_len))) { if ((json = bson_as_canonical_extended_json (b, NULL))) { printf ("%s\n", json); bson_free (json); } bson_destroy (b); }
Recursivamente en subdocumentos
Libbson proporciona subiteradores prácticos para explorar un subdocumento o una submatriz. A continuación, se muestra un ejemplo que explora un subdocumento llamado "foo" e imprime sus nombres de campo.
bson_iter_t iter; bson_iter_t child; char *json; if (bson_iter_init_find (&iter, doc, "foo") && BSON_ITER_HOLDS_DOCUMENT (&iter) && bson_iter_recurse (&iter, &child)) { while (bson_iter_next (&child)) { printf ("Found sub-key of \"foo\" named \"%s\"\n", bson_iter_key (&child)); } }
Encontrar campos usando la notación de puntos
Usando la función bson_iter_recurse ejemplificada anteriormente, bson_iter_find_descendant puede encontrar un campo para usted usando la notación de ruta de estilo MongoDB como "foo.bar..baz".0
Creemos un documento como {"foo": {"bar": [{"baz: 1}]}} y localicemos el campo "baz".
bson_t *b; bson_iter_t iter; bson_iter_t baz; b = BCON_NEW ("foo", "{", "bar", "[", "{", "baz", BCON_INT32 (1), "}", "]", "}"); if (bson_iter_init (&iter, b) && bson_iter_find_descendant (&iter, "foo.bar.0.baz", &baz) && BSON_ITER_HOLDS_INT32 (&baz)) { printf ("baz = %d\n", bson_iter_int32 (&baz)); } bson_destroy (b);
Validación de un documento BSON
Si todo lo que desea hacer es validar que un documento BSON sea válido, puede utilizar bson_validate.
size_t err_offset; if (!bson_validate (doc, BSON_VALIDATE_NONE, &err_offset)) { fprintf (stderr, "The document failed to validate at offset: %u\n", (unsigned) err_offset); }
Consulte la documentación de bson_validate para obtener más información y ejemplos.