使用RapidJSON

时间:2016-04-21 15:48:30

标签: c++ json geojson rapidjson

我使用RapidJSON解析大型GeoJSON文件。这些文件中的大多数内容(以及解析后的内存)都是巨大的坐标数组。对于我的申请,我对这些不感兴趣。在解析时,我更喜欢跳过它们(不为它们分配内存)。基于使用SAX API的一些测试,我希望这大约是解析速度的两倍。

我最初的想法是写一个自定义Handler。我必须使用自己的堆栈构建自己的Value对象,但是,这项工作会复制GenericDocument类所做的事情。

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

自定义处理程序是否有自己的堆栈正确的方式去这里?有没有人以前做过这样的事情?

1 个答案:

答案 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事件,并将事件转发给文档。

一个例子可能更好。你可以放弃一个问题。

更新:已添加两个示例。

  • filterkey:一个命令行工具,用于删除用户指定密钥的所有值。
  • filterkeydom:与上述工具相同,但它演示了如何使用生成器填充Document