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

Skip certain fields while parsing a document with RapidJSON

本文关键字:字段 文档 RapidJSON      更新时间:2023-10-16

我正在使用RapidJSON来解析大型GeoJSON文件。这些文件(以及解析后的内存)中的大多数内容都是巨大的坐标数组。对于我的应用程序,我对这些不感兴趣。我宁愿在解析时跳过它们(而不是为它们分配内存)。根据使用 SAX API 的一些测试,我预计这将大约将解析速度提高一倍。

我最初的想法是编写一个自定义处理程序。我必须使用自己的堆栈构建自己的 Value 对象,但是,这将复制 GenericDocument 类所做的工作。

我的下一个想法是将GenericDocument子类化。但是,它的ParseStream和处理程序方法并不virtual,所以我无法使用它自己的方法。我可以实现我自己的ParseStream,但stack_字段是私有的,所以即使是子类也无法访问它。

具有自己的堆栈的自定义处理程序是正确的方法吗?以前有人做过这样的事情吗?

在 RapidJSON 中实现 JSON 模式验证器功能期间,我为 Document::Populate(generator) 添加了一个新的 API,它使用生成器来填充文档的内容。它应该适合这个。

目前它显示在这里:

// 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