转义 json 的文件路径 (JsonCPP)

escaping file paths for json (JsonCPP)

本文关键字:JsonCPP 路径 文件 json 转义      更新时间:2023-10-16

我们使用json格式来存储配置数据,使用JsonCPP来处理格式。最近的扩展要求存储某些 (Windows) 文件路径的字段。存储 std::string 就可以了 - 只要路径不包含任何有趣的东西,比如空格,路径在其中获取引号:C:my_directorydata.dat工作正常,但"C:my directorydata.dat"失败,相应的键变得"path"=""C:my directorydata.dat""无效的 json

逃避是标准答案,显然我可以写我自己的逃避/取消逃避,但我不应该重新发明轮子,所以我想问是否有一个 - 标准、简单、轻量级的方法是什么(最好没有 Boost 或同样重的东西)?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();

当然,每个像样的 JSON 库都必须进行转义,取消转义本身,这是任何序列化库的核心要求。如果 JsonCpp 没有提供它(没有任何经验),那么您需要考虑切换到其他东西。一些候选人:

  • Json for Modern C++,顾名思义,您必须至少具有 C++-11 兼容版本。
  • Picojson,仅标题易于使用的库。

我会提到 Boost 属性树的 JSON 序列化程序,但你说没有 Boost((.