2016-04-30 16 views
0

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;

答えて

1

。それを使用する前に解放されています。

代わりに、関数がその記憶域を保持する文字列型(std :: stringなど)を返すようにすることを検討してください。

+0

上記の更新を参照して、戻り値の型を置き換えてみましたが、セグメンテーション違反を受け取りました。 –

+0

segfaultingはどこですか?それは実際に戻り値でsegfaultingですか?あなたは本当に一時的なものを必要としません。戻り値の型が 'std :: string'で' s.GetString() 'を返すことができます。また、 'Writer :: String()'はstd :: stringも直接取ることができます。 –

+0

どちらの場合でも、デバッグの方法が返されている可能性があります。そうすれば、変更された戻り値の型がsegfaultに何らかの形で関連していないことを検証できます。 –