2017-05-30 82 views
0

jsonCPを使用してフォーマットを処理するために、jsonフォーマットを使用して構成データを保管しています。最近の拡張では、いくつかの(Windowsの)ファイルパスを格納するフィールドが必要です。そして、std :: stringの動作は - パスに何か面白いものが含まれていない限り、パスが引用符を取得する場所のように、C:\my_directory\data.datは正常に動作しますが、"C:\my directory\data.dat"が失敗し、対応するキーは"path"=""C:\my directory\data.dat""になります。jsonjson(JsonCPP)のファイルパスをエスケープする

エスケープは標準的な答えですが、私は自分のエスケープ/エスケープを書くことができますが、私は車輪を作り直すべきではありませんので、標準のシンプルで軽量なアプローチまたは何か同じように重い)? JsonCPPのいくつかの組み込み関数、stdlibを使用するイディオム/スニペット、Windows APIライブラリ呼び出し?

JSONでの保存のためにファイルパスをエスケープする「業界標準」アプローチとは何ですか?

VC++; Visual Studio 2015、Win10、MFC。

編集:コード。もちろん

std::string SignalControlDialog::GetDlgItemStdString(UINT id) 
{ 
    TCHAR entry_tchar[1024]; 
    LPTSTR entry_lptstr = entry_tchar; 
    GetDlgItemText(id, entry_lptstr, 1024); 
    std::wstring entry_wstring(&entry_tchar[0]); 
    std::string entry_string(entry_wstring.begin(), entry_wstring.end()); 

    return entry_string; 
} 

//... 

    data->project_file = GetDlgItemStdString(IDC_EDIT1); 


//... 

    Json::Value config; 
    Json::StyledStreamWriter writer; 

    config["crossingfile"] = data::project_file; 

    std::ofstream stream; 
    stream.open(GetFileName().c_str()); 
    if (stream.fail()) 
     return FALSE; 

    writer.write(stream, config); 
    stream.close(); 
+0

私のテストではあなたが引用符を入れた場合、それは自動的に、独自のエスケープ文字を追加しますJsonCPP' '使用。どのようなコードあなたが使ったのですか? – Galik

+0

@Galik:編集を参照してください –

+0

これを行うとどうなるでしょうか?[config ["crossingfile"] = R "(" C:\ my directory \ data.dat ")"; ' – Galik

答えて

0

は、すべてのまともなJSONライブラリ自体をアンエスケープ、エスケープしなければならない、それがどのシリアライズライブラリのコア要件です。 JsonCppがそれを提供していない場合(それについての経験はありませんでした)、他のものに切り替えることを検討する必要があります。いくつかの候補:

  • Json for Modern C++のように、少なくともC++ - 11互換ビルドが必要です。
  • Picojson、ヘッダー専用の使いやすいライブラリです。

((私はブーストプロパティツリーのためのJSONシリアライザを言及しますが、あなたは何のブーストを言わなかった。

関連する問題