2012-07-18 67 views
1

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

比方说,我有一个JSON数组,看起来像这样:

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

,我想将其转换为.csv的是,(据我所知)将

Bcode,firstname,lastname, 
11234,richard,nixon 

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

另外,有没有任何文件扩展名,我可以保存JSON数组,以便可以通过MSExcel读取?

谢谢

回答

1

没有理由删除引号 - CSV可以(并经常)包括它们。只要你想在域中包含一个逗号(例如,如果你有一个“名称”字段而不是firstnamelastname作为单独的字段,它的值可能是:“Nixon,Richard”),如果你删除了报价时,将不再看起来像一个单一的领域。

你想在该行的末尾删除逗号。

我也会考虑,包括一个嵌入式的报价任何领域。如果没记错,JSON使用\"来表示一个字段内的报价,CSV使用"",因此除非您的数据不包含任何嵌入式报价,否则您可能需要处理以""替换\"以及

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(); 

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

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

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