現在、私が使用している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 *
を定義されています。kObjectKeyName
はconst 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
の代わりにValue
をtoJson
に使用するようにコードを修正してから、引数としてアロケータを渡します。理想的には、私が怠け者であり、署名を同じにしたかったので、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を使用し始めとして、奇数/ダムをしています間違いなく何かがありません。私は自分の問題を絞り込み、自分のやり方の誤りをよりよく理解しようとしているだけです。