c++ - bsoncxx::to_json 返回损坏的字符串

标签 c++ json c++11 bson mongo-cxx-driver

我在使用 bsoncxx 将 bson 文档转换为 json 字符串时遇到困难。 bsoncxx::to_json 函数返回“无效”/损坏的 std::string 对象。 我无法读取其中的字符,并且当 std::string 被破坏时它会崩溃..

我已经重建了一切:mongoc、libbson、mongocxx 等...

这是一个示例代码:

bsoncxx::builder::basic::document doc{};
doc.append(bsoncxx::builder::basic::kvp("test", 1));
auto string = bsoncxx::to_json(doc);

我无法从字符串中提取数据,因为当我尝试使用 std::copy 复制内容时,std::end(string) 因“读取访问冲突”而崩溃...

Image

我在程序中的任何地方都使用 mongodb 并访问 bson 文档,一切正常。我尝试在 mongodb 查询返回的现有 bson 文档上调用 bsoncxx::to_json 但它具有相同的行为...

我正在尝试使用 boost tcp 套接字将字节数组(加上一些信息,例如如何解码字节数组)流式传输到nodejs程序,所以我想我可以简单地创建一个带有“二进制字段”的文档,转换它转换为 json 并通过 tcp 套接字流式传输...

有人知道我该如何做到这一点,可以通过修复 bsoncxx::to_json 或使用其他东西吗?

谢谢

编辑:

有关信息,我正在 Windows 10 x64 上使用 Visual Studio 2015 进行编译

最佳答案

我直接使用 libbson 而不是 bsoncxx 解决了这个问题...我查看了 bsoncxx::to_json 中的代码,并提取了它:

std::string ret;

bson_t bson;
auto view = document.view();
bson_init_static(&bson, view.data(), view.length());

size_t size;
auto result = bson_as_json(&bson, &size);
if (!result)
    return "Error converting to json";

ret = std::string(result);

bson_free(result);

return std::move(ret);

看起来工作正常!

关于c++ - bsoncxx::to_json 返回损坏的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40309483/

相关文章:

c++ - 由于模板函数,我如何避免#includ-ing <sstream>?

c++ - 对提供核心转储的 ostringstream 对象执行 .str().c_str() 操作

c++ - "char[]"是正确的类型吗?

c++ - 继承:构造函数,像c++11中基类的数组成员一样初始化C

c++ - C++11 中的逗号运算符(排序)

java - 用于布局布线的模拟退火

c++ - 我想访问 std::unique_ptr 中的特定元素

java - 将 JSON 响应与动态键绑定(bind)到 Java 对象

c# - 无法将 List<> 对象序列化/反序列化为 JSON

json - 阻止用户对 mongodb 进行 Json 查询