使用 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
。
我正在使用 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
。