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);
Кажется, работает нормально!