2016-04-21 110 views
0

我使用RapidJSON解析大型GeoJSON文件。這些文件中的大部分內容(以及解析後的內存)都是巨型座標數組。對於我的申請,我對這些不感興趣。我希望在解析時跳過它們(不爲它們分配內存)。根據一些使用SAX API的測試,我預計這會大大加快解析速度。使用RapidJSON解析文檔時跳過某些字段

我最初的想法是寫一個自定義Handler。我不得不使用自己的堆棧來構建自己的Value對象,但是,將會複製GenericDocument類所完成的工作。

我的下一個想法是子類GenericDocument。其ParseStream和處理程序方法不是virtual,但是,所以我不能讓它使用我自己的。我可以實現我自己的ParseStream,但stack_字段是私有的,所以即使是一個子類也無法訪問它。

自定義處理程序有自己的堆棧正確的方式去這裏?有沒有人做過這樣的事情?

+0

FWIW,這是一個[版本](https://gist.github.com/danvk/90beec9f0387788eca9c1ba8402dbee1),它具有自己的堆棧和Handler實現的'GenericValue'子類。它的工作原理很快,但在代碼複製方面還有很多不足之處。我很想得到一些關於是否有更好的方法的反饋。 – danvk

回答

1

在實現RapidJSON中的JSON模式驗證器功能期間,我爲Document::Populate(generator)添加了一個新的API,它使用生成器來填充文檔的內容。它應該適合這個。

目前,它是顯示在here

// Parse JSON from reader, validate the SAX events, and store in d. 
Document d; 
SchemaValidatingReader<kParseDefaultFlags, FileReadStream, UTF8<> > reader(is, schema); 
d.Populate(reader); 

d.Populate(generator)將調用generator(d),然後generator生成SAX事件併發送至d

因此,應該可以編寫一個自定義SAX處理程序,它可以過濾一些SAX事件並將事件轉發到文檔。

一個例子可能會更好。你可能會放棄一個問題。


更新:已添加兩個示例。

  • filterkey:一個命令行工具,用於刪除用戶指定的鍵的所有值。
  • filterkeydom:與上述相同的工具,但它演示瞭如何使用生成器來填充Document
+0

感謝您的建議。我提交了[問題](https://github.com/miloyip/rapidjson/issues/613)。 – danvk