【问题标题】:escaping file paths for json (JsonCPP)转义 json (JsonCPP) 的文件路径
【发布时间】:2017-05-30 11:13:25
【问题描述】:

我们使用 json 格式来存储配置数据,使用 JsonCPP 来处理格式。最近的扩展要求存储一些(Windows)文件路径的字段。并且存储 std::string 工作 - 只要路径不包含任何有趣的东西,比如空格,路径获得引号:C:\my_directory\data.dat 工作正常,但 "C:\my directory\data.dat" 失败,相应的键变成 "path"=""C:\my directory\data.dat"" 哪个json 无效

转义是标准答案,显然我可以编写自己的逃生/逃生,但我不应该重新发明轮子,所以我想问一下是否有一个 - 标准、简单、轻量级的方法是什么(最好没有Boost或同样重的东西)? JsonCPP的一些内置函数,一个使用stdlib的成语/sn-p,一个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();

【问题讨论】:

  • 在我使用JsonCPP 的测试中,如果您将引号放入,它会自动添加自己的转义字符。您使用了什么代码?
  • @Galik:见编辑。
  • 如果你这样做会发生什么? config["crossingfile"] = R"("C:\my directory\data.dat")";
  • @Galik:需要一些时间来告诉我,我现在没有编译环境......

标签: c++ json escaping filepath


【解决方案1】:

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

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

我会提到 Boost Property Tree 的 JSON 序列化程序,但你说没有 Boost((.

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2013-08-01
    • 2014-01-16
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多