3次元のオブジェクトを表すクラスと、ドキュメントベースのデータベースに書き戻すためにオブジェクトをJSONに変換するconst char *を出力するto_jsonメソッドがあります。しかし、to_jsonをする方法は、未知の文字を出力するのではなくJSONメッセージC++ RapidJSON WriterとString Buffer不明な文字を出力する
const char* Obj3::to_json() const
{
logging->info("Obj3:To JSON Called");
//Initialize the string buffer and writer
StringBuffer s;
Writer<StringBuffer> writer(s);
//Start writing the object
//Syntax taken directly from
//simplewriter.cpp in rapidjson examples
writer.StartObject();
writer.Key("key");
std::string key = get_key();
writer.String(key.c_str(), (SizeType)key.length());
writer.Key("owner");
std::string owner_dev = get_owner();
writer.String(owner_dev.c_str(), (SizeType)owner_dev.length());
writer.Key("name");
std::string name = get_name();
writer.String(name.c_str(), (SizeType)name.length());
writer.Key("type");
std::string type = get_type();
writer.String(type.c_str(), (SizeType)type.length());
writer.Key("subtype");
std::string subtype = get_subtype();
writer.String(subtype.c_str(), (SizeType)subtype.length());
int i;
int j;
writer.Key("location");
writer.StartArray();
for (i=0; i<3; i++) {
writer.Double(static_cast<double>(get_loc(i)));
}
writer.EndArray();
writer.Key("transform");
writer.StartArray();
for (i=0; i<4; i++) {
writer.StartArray();
for (j=0; j<4; j++) {
writer.Double(static_cast<double>(transform_matrix(i, j)));
}
writer.EndArray();
}
writer.EndArray();
writer.Key("scenes");
writer.StartArray();
for (i=0; i<num_scenes(); i++) {
std::string sc = get_scene(i);
writer.String(sc.c_str(), (SizeType)sc.length());
}
writer.EndArray();
writer.Key("locked");
writer.Bool(is_locked);
writer.EndObject();
//The Stringbuffer now contains a json message
//of the object
if (writer.IsComplete()) {
logging->debug("Valid JSON Encountered");
try {
return s.GetString();
}
catch (std::exception& e) {
logging->error("Exception Encountered parsing JSON");
logging->error(e.what());
}
}
else {
return "";
}
}
ログは、以下の出力が表示されます。
2016-04-30 13:15:54,151 [INFO] Obj3:To JSON Called
2016-04-30 13:15:54,151 [DEBUG] Valid JSON Encountered
��
私は配列やルートオブジェクトのすべてを閉じ、そして午前ましたAPIごとの完全性をチェックしますが、出力はstd :: coutまたはlog4cppで読み込みできません。
//The Stringbuffer now contains a json message
//of the object
if (writer.IsComplete()) {
logging->debug("Valid JSON Encountered");
try {
const char* ret_val = s.GetString();
std::string ret_string (ret_val);
return ret_string;
}
catch (std::exception& e) {
logging->error("Exception Encountered parsing JSON");
logging->error(e.what());
}
}
else {
return "";
}
セグメンテーションフォールトでその結果を:応答の下に、私ははstd :: stringとするreturn文を以下に戻り値の型を更新パー
--Edit--
。
以下の方法は、試験中に呼び出されている:const char *
戻り値がスタックにあるs
値を指している
std::cout << obj.to_json() << std::endl;
上記の更新を参照して、戻り値の型を置き換えてみましたが、セグメンテーション違反を受け取りました。 –
segfaultingはどこですか?それは実際に戻り値でsegfaultingですか?あなたは本当に一時的なものを必要としません。戻り値の型が 'std :: string'で' s.GetString() 'を返すことができます。また、 'Writer :: String()'はstd :: stringも直接取ることができます。 –
どちらの場合でも、デバッグの方法が返されている可能性があります。そうすれば、変更された戻り値の型がsegfaultに何らかの形で関連していないことを検証できます。 –