我正在尝试将JSON数组转换为C ++中的CSV文件,我很好奇该方法应该是什么。
假设我有一个看起来像这样的JSON数组:
[["Bcode","firstname","lastname"],
["11234","richard","nixon"]]
我希望将它转换为.csv,(据我所知)将是
Bcode,firstname,lastname,
11234,richard,nixon
我收到的JSON数组似乎已经有了换行符,所以我可以删除所有的引号和括号并让它成为可行的CSV文件吗?
或者,是否有任何文件扩展名我可以将JSON数组保存到MSExcel可读取的文件中?
由于
答案 0 :(得分:1)
没有理由删除引号 - CSV可以(并经常)包含它们。他们可能希望在字段中包含逗号(例如,如果您有一个"名称"字段而不是firstname
和lastname
作为单独的字段,则需要它们,价值可能是:" 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。