【问题标题】:Emitting JSON with yaml-cpp?使用 yaml-cpp 发出 JSON?
【发布时间】:2017-10-09 17:16:47
【问题描述】:

我在我的项目中使用 yaml-cpp 来处理各种事情。现在我想把一些数据写成 JSON。由于 JSON 是 YAML 的子集,至少对于我需要的功能,我理解应该可以在 yaml-cpp 中设置一些选项来输出纯 JSON。这是怎么做到的?

【问题讨论】:

    标签: json yaml yaml-cpp


    【解决方案1】:

    Jesse Beder 的回答似乎对我不起作用;我仍然使用 YAML 语法得到多行输出。但是,我发现通过在<< YAML::Flow 之后立即添加<< YAML::BeginSeq,您可以强制所有内容以JSON 语法结束。然后您必须删除开头的[ 字符:

    YAML::Emitter emitter;
    emitter << YAML::DoubleQuoted << YAML::Flow << YAML::BeginSeq << node;
    std::string json(emitter.c_str() + 1);  // Remove beginning [ character
    

    Here is a fully worked example.

    但仍然存在一个主要问题:引用数字,将它们转换为字符串。我不确定这是否是YAML::DoubleQuoted 的故意行为;查看测试,我没有看到任何测试用例涵盖当您将DoubleQuoted 应用于数字时会发生什么。此问题已提交here

    【讨论】:

      【解决方案2】:

      yaml-cpp 没有直接强制输出与 JSON 兼容的方法,但您可以模拟它。

      YAML:Emitter Emitter;
      emitter << YAML:: DoubleQuoted << YAML::Flow << /* rest of code */;
      

      【讨论】:

      • 这似乎适用于我的情况,发出有效的 JSON。我只有一个问题:以上结果所有 JSON 都排在一条长线上。有没有办法让它也有换行符和缩进?
      • 我不这么认为。
      • 这似乎不再起作用,或者至少在更复杂的 YAML 上不起作用。在执行复杂的 时,我使用 YAML 样式的数组和对象将所有内容放在不同的行上
      • 看起来这可能是在每个节点的基础上设置的? (流与无流)
      • 如果你有空值,这不起作用。 yaml-cpp 似乎只使用 ~ 作为 null,我找不到真正强制它使用 null 的方法
      猜你喜欢
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多