在C ++中将JSON转换为CSV

时间:2012-07-18 16:24:37

标签: c++ json excel csv

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

假设我有一个看起来像这样的JSON数组:

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

我希望将它转换为.csv,(据我所知)将是

Bcode,firstname,lastname,
11234,richard,nixon

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

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

由于

2 个答案:

答案 0 :(得分:1)

没有理由删除引号 - CSV可以(并经常)包含它们。他们可能希望在字段中包含逗号(例如,如果您有一个"名称"字段而不是firstnamelastname作为单独的字段,则需要它们,价值可能是:" Nixon,Richard"。如果删除引号,它将不再像单个字段。

您确实要删除该行末尾的逗号。

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

答案 1 :(得分:0)

正式来说,JSON字符串可能包含转义字符,例如“\ n”,“\ u20AC”。

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

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

您可以查看支持SAX样式API的rapidjson

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

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

然后,读者将在解析输入流时调用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。