2

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) が「読み取りアクセス違反」でクラッシュするため、文字列からデータを抽出できません...

画像

私はプログラムのどこでもmongodbを使用しており、bsonドキュメントにアクセスしていますが、すべて正常に動作しています。mongodb クエリによって返された既存の bson ドキュメントで bsoncxx::to_json を呼び出そうとしましたが、同じ動作でした...

ブーストtcpソケットを使用してバイト配列(さらに、バイト配列のデコード方法などの情報)をnodejsプログラムにストリーミングしようとしているので、「バイナリフィールド」を使用してドキュメントを作成し、それをjsonに変換するだけでよいと思いましたTCPソケット経由でストリーミングします...

bsoncxx::to_jsonを修正するか、何か他のものを使用して、私がそれを行う方法を知っている人はいますか?

ありがとう

編集:

詳細については、Windows 10 x64 で Visual Studio 2015 を使用してコンパイルしています。

4

1 に答える 1

2

bsoncxxの代わりにlibbsonを直接使用して問題を修正しました... 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);

うまくいくようです!

于 2016-10-28T17:35:36.913 に答える