解析和迭代 BSON 文档
解析
BSON 文档会根据需要进行延迟解析。要开始解析 BSON 文档,请使用提供的 Libbson 函数之一创建新的 bson_t 来自现有数据,例如 bson_new_from_data 。这将复制数据,以便 BSON 文档发生其他更改。
提示
如果只想解析 BSON 文档而无需对其进行更改,则可以使用 bson_init_static 以避免复制数据。
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);
创建新的 bson_t 时仅执行两项检查 从现有的缓冲区。首先,文档必须以缓冲区长度开始,与调用者的预期相匹配。其次,文档必须以预期的结尾\0
字节结束。
为了进一步解析文档,我们使用 bson_iter_t 迭代文档中的元素。让我们打印文档中的所有字段名称。
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); }
将文档转换为 JSON 使用 bson_iter_t 和 bson_visitor_t 以递归方式遍历 BSON 文档的所有字段并生成 UTF-8 编码的 JSON 字符串。
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); }
递归到子文档
Libbson 提供了方便的子迭代器来深入研究子文档或子数组。 下面的示例将深入到名为“foo”的子文档并打印其字段名称。
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)); } }
使用点表示法查找字段
使用 bson_iter_recurse 上面举例说明的函数 bson_iter_find_descendant 可以使用 MongoDB 样式路径表示法为您查找字段,例如“foo.bar.0 .baz”。
让我们创建一个类似{"foo": {"bar": [{"baz: 1}]}}
的文档并找到"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);
验证 BSON 文档
如果您只想验证 BSON 文档是否有效,则可以使用 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); }
请参阅 bson_validate 文档以获取更多信息和示例。