2017-03-17 10 views
0

現在、私が使用しているJSONシリアライザクラスがあります。それは私が取り組んでいる実験的なコードのためのものです。このコードはcpprestsdkを使用しています。シリアル化は、rapidjsonまたはcpprestsdkのjsonを使用するように設定されています。私は何の問題JSONから変換することはできません文字列に変換する際にrapidjsonが矛盾した結果を生成する

virtual void toJson(rapidjson::Document& json) const =0; 
virtual void toJson(web::json::value& json) const =0; 

virtual void fromJson(const rapidjson::Value& json) =0; 
virtual void fromJson(const web::json::value& json) =0; 

:よう

だから例えば、クラスの仮想関数が見えます。私は現在、クラスオブジェクトをJSONに変換してから、文字列としてファイルにエクスポートしています。私はrapidjsonを使用すると、結果が変わることがわかりました。を変更せずに、これは、連続した実行のためにある

"base": { 
     "name": "base", 

:私はこのようなスニペットを参照してください、他の実行に

"base": { 
     "name\u0000refere": "base", 

は、一部の輸出に、私はこのようなスニペットを参照してくださいコード。

は、フィールドは、実際に世界的にそうようconst char *を定義されています。kObjectKeyNameconst char *kObjectKeyName = "name";のように定義されて

void Object::toJson(rapidjson::Document& json) const { 
    using namespace rapidjson; 

    json.SetObject(); // Reset and clear any existing 

    auto& allocator = json.GetAllocator(); 

    json.AddMember(StringRef(kObjectKeyName), Value(name.c_str(), allocator), allocator); 
    json.AddMember(StringRef(kObjectKeyPrioritizeTable), Value(prioritizeTable), allocator); 
    json.AddMember(StringRef(kObjectKeyPrioritizeGreaterOn), Value(prioritizeGreaterOn), allocator); 
} 

注こと:

const char *kSymbolKeyName = "name"; 
const char *kSymbolKeyReferenceName = "referenceName"; 

問題がありますJSONオブジェクトを生成するコードは次のようになります。

そして、このクラスのtoJsonに、発信者は次のようになります。問題の一部は、私はrapidjson::Document sおよびアロケータを使用しています方法に由来して

using namespace rapidjson; 

json.SetObject(); // Reset and clear any existing 

auto& allocator = json.GetAllocator(); 

for (const auto& it : tables) { 
    Document iJson; 
    it.second->toJson(iJson); 
    json.AddMember(Value(it.first.c_str(), allocator), iJson, allocator); 
} 

。私はtoJsonコールは、私がSetObject呼び出しを行うと、それ自身のアロケータで終了すると信じています。

私の計画ではDocumentの代わりにValuetoJsonに使用するようにコードを修正してから、引数としてアロケータを渡します。理想的には、私が怠け者であり、署名を同じにしたかったので、rapidjsonまたはcppsrestsdkの息子の間で簡単にやりとりすることができたからです。

そうそう、文字列として出力するコードファイルには、次の

 std::ofstream out("output.json"); 
     rapidjson::Document outDoc; 

     dataSet.toJson(outDoc); 

     rapidjson::StringBuffer buffer; 

     buffer.Clear(); 

     rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer); 
     outDoc.Accept(writer); 
     out << buffer.GetString(); 

     out.close(); 

である私は最近rapidjsonを使用し始めとして、奇数/ダムをしています間違いなく何かがありません。私は自分の問題を絞り込み、自分のやり方の誤りをよりよく理解しようとしているだけです。

答えて

0

アロケータを渡すプロセスを変更すると表示されます。私は私の使い方で

rapidjson::Value toJson(rapidjson::Document::AllocatorType& allocator); 

であることを私のtoJson機能を変更

、必要なときには、生成されたすべてのValue秒を意味し、ベースDocumentのアロケータを使用します。

関連する問題