“文档” 菜单
文档首页
/ / /
C 驱动程序
/ /

解析和迭代 BSON 文档

在此页面上

  • 解析
  • 递归到子文档
  • 使用点表示法查找字段
  • 验证 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_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 文档以获取更多信息和示例。

后退

ObjectID

来年

UTF-8