使用 RapidJSON 解析文档时跳过某些字段

Skip certain fields while parsing a document with RapidJSON

我正在使用 RapidJSON 来解析大型 GeoJSON 文件。这些文件中的大部分内容(以及解析后的内存)都是巨大的坐标数组。对于我的申请,我对这些不感兴趣。我宁愿在解析时跳过它们(不为它们分配内存)。基于使用 SAX API 的一些测试,我预计这会使解析速度大致翻倍。

我最初的想法是写一个自定义Handler。我必须使用自己的堆栈构建自己的 Value 对象,但是,工作会重复 GenericDocument class.

所做的工作

我的下一个想法是 class GenericDocument。但是,它的 ParseStream 和 Handler 方法不是 virtual,所以我无法使用我自己的方法。我可以实现自己的 ParseStream,但是 stack_ 字段是私有的,因此即使是子 class 也无法访问它。

具有自己的 Stack 的自定义 Handler 是正确的方法吗?有人做过这样的事吗?

在 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