【问题标题】:Converting JSON to CSV in C++在 C++ 中将 JSON 转换为 CSV
【发布时间】:2012-07-18 16:24:37
【问题描述】:

我正在尝试将 JSON 数组转换为 C++ 中的 CSV 文件,我很好奇该方法应该是什么。

假设我有一个如下所示的 JSON 数组:

[["Bcode","firstname","lastname"],
["11234","richard","nixon"]]

我想将其转换为 .csv(据我了解)

Bcode,firstname,lastname,
11234,richard,nixon

我得到的 JSON 数组似乎已经有一个换行符,所以我可以删除所有的引号和括号,让它成为一个可行的 CSV 文件吗?

或者,是否有任何文件扩展名可以保存 JSON 数组以供 MSExcel 读取?

谢谢

【问题讨论】:

    标签: c++ json excel csv


    【解决方案1】:

    没有理由删除引号 - CSV 可以(并且经常)包含它们。每当您可能想在字段中包含逗号时,它们都是必需的(例如,如果您有一个“名称”字段而不是 firstnamelastname 作为单独的字段,则值可能是:“尼克松,理查德”。如果您删除引号,它将不再像单个字段。

    您确实想删除行尾的逗号。

    我还会考虑包含嵌入式引号的任何字段。如果没记错的话,JSON 使用 \" 来表示字段内的引用。 CSV 使用"",因此除非您的数据不/不会包含任何嵌入式引号,否则您可能还需要处理将\" 替换为""

    【讨论】:

      【解决方案2】:

      从形式上讲,JSON 字符串可能包含转义字符,例如“\n”、“\u20AC”。

      要处理所有这些情况,您需要一个 JSON 解析器来解析 JSON 文本。

      在您的应用程序中,可以使用 SAX 样式(基于事件)的 API,即从头到尾扫描 JSON 文件,而无需生成中间 DOM(文档对象模型)。

      您可以查看rapidjson,它支持 SAX 风格的 API。

      您可以编写一个 CSV 写入器,参考 $rapidjson::Writer$,从事件中输出 CSV 字符串。代码将如下所示:

      CsvWriter writer(outputStream);
      rapidjson::Reader reader;
      reader.Parse<0>(inputStream, writer);
      

      然后,reader 在解析输入流的过程中会调用 writer 的成员函数。在您的示例中,它将按以下顺序调用函数:

      writer.StartArray();
      writer.StartArray();
      writer.String("Bcode", 5, true);
      writer.String("firstname", 9, true);
      writer.String("lastname", 8, true);
      writer.EndArray();
      writer.StartArray();
      writer.String("11234", 5, true);
      writer.String("richard", 7, true);
      writer.String("nixon", 5, true);
      writer.EndArray();
      writer.EndArray();
      

      String() 的第二个参数是字符串的长度。第三个参数表示是否应该复制字符串。

      用这些函数调用写出你自己的 CSV 格式应该很容易。

      最后,需要注意的是,使用 SAX 风格的 API 将需要更少的内存消耗,但处理程序可能比 DOM 版本更难编写。 rapidjson 支持您选择的 SAX 和 DOM 样式 API。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        • 2017-11-30
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多