2012-07-18 217 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。