1

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

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

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

我想将它转换为 .csv ,(据我了解)将是

Bcode,firstname,lastname,
11234,richard,nixon

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

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

谢谢

4

2 回答 2

1

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

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

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

于 2012-07-18T16:36:49.520 回答
0

形式上来说,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。

于 2012-11-14T09:02:06.370 回答