bsoncxx::to_json возвращает поврежденную строку

У меня возникают трудности при преобразовании документа bson в строку json с помощью bsoncxx. Функция 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::end(string) аварийно завершает работу с "нарушением прав чтения", когда я пытаюсь скопировать содержимое с помощью std:: copy...

Образ

Я использую mongodb везде в программе и получаю доступ к документам bson, и все работает отлично. Я пытался вызвать bsoncxx::to_json для уже существующего документа bson, возвращенного запросом mongodb, но он имел такое же поведение...

Я пытаюсь передать поток байтового массива (плюс некоторую информацию, например, как декодировать байтовый массив), используя форсированные tcp сокеты для программы nodejs, поэтому я подумал, что могу просто создать документ с "двоичным полем", преобразовать его в json и поток его через сокет tcp...

Кто-нибудь знает, как я мог это сделать, исправив bsoncxx::to_json или используя что-то еще?

Спасибо

Редактировать:

Для информации я собираю с Visual Studio 2015 на Windows 10 x64

1 ответ

Решение

Я исправил проблему, используя 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);

Кажется, работает нормально!

Другие вопросы по тегам