我使用RapidJSON解析大型GeoJSON文件。这些文件中的大多数内容(以及解析后的内存)都是巨大的坐标数组。对于我的申请,我对这些不感兴趣。在解析时,我更喜欢跳过它们(不为它们分配内存)。基于使用SAX API的一些测试,我希望这大约是解析速度的两倍。
我最初的想法是写一个自定义Handler。我必须使用自己的堆栈构建自己的Value对象,但是,这项工作会复制GenericDocument
类所做的事情。
我的下一个想法是继承GenericDocument
。它的ParseStream
和Handler方法不是virtual
,但是我无法使用我自己的方法。我可以实现自己的ParseStream
,但stack_
字段是私有的,所以即使是子类也无法访问它。
自定义处理程序是否有自己的堆栈正确的方式去这里?有没有人以前做过这样的事情?
答案 0 :(得分: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事件,并将事件转发给文档。
一个例子可能更好。你可以放弃一个问题。
更新:已添加两个示例。
Document
。