2016-10-28 6 views
1

У меня возникли трудности с преобразованием документа bson в строку json с использованием bsoncxx. Функция bsoncxx :: to_json возвращает «недопустимый»/поврежденный объект станд :: строка .. Я не могу прочитать символ в нем, и его падение, когда станд :: строка разрушается ..bsoncxx :: to_json return corrupted string

I «ве восстановить все: mongoc, libbson, mongocxx и т.д ...

Вот пример кода:

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

Я не могу извлечь данные из строки, потому что станд :: конец (строка) сбой при «нарушении прав доступа на чтение», когда я пытаюсь скопировать содержимое с помощью std :: copy ...

Image

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

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

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

благодаря

Edit:

Для информации, я компиляции с Visual Studio 2015 на Windows, 10 x64

+0

Привет, не могли бы вы предоставить [SSCCE] (http://sscce.org)? Я бы хотел попробовать в Windows и Linux и посмотреть, смогу ли я его воспроизвести. – xdg

+0

Привет, извините за задержку. Вам нужен zip с .dll и вечно или только основной файл cpp? Потому что я сделал новый проект только с 3-мя строками в вопросе (+ включает) и имеет такое же поведение – pascx64

+0

https://1drv.ms/f/s!AueTJubu1l2CgzPHROVvdil6yOau Вот ссылка со всем, кроме boost. Я использую boost 1.61 – pascx64

ответ

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); 

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