如何在使用rapidjson解析JSON字符串时区分键和值

How to differentiate between key and value while parsing JSON string using rapidjson?

本文关键字:字符串 JSON 时区 键和值 解析 rapidjson      更新时间:2023-10-16

我正在使用"rapidjson"解析JSON字符串。我正在学习json对象的SAX类型解析的以下示例。

https://github.com/miloyip/rapidjson/blob/75cee948d44876f22f7215b9bd64733c3d7fee51/example/simplereader/simplereader.cpp

在此SAX类型解析中,在解析过程中,rapidjson为接收到的每种数据类型调用事件处理程序。(作为文件在(https://github.com/miloyip/rapidjson/blob/2e0b3de8d68758b2866fff5f047c893b8a1c4290/doc/sax.md)

如何区分给定的元素是键和与该键对应的值?

您只能通过事件顺序来区分键和值。

Reader (SAX解析器)遇到JSON对象时,它调用处理程序的StartObject()。然后会有一个键值对序列。该键必须为String()调用,但可以是任何JSON值类型。最后调用EndObject()

因此,需要跟踪解析的状态。对于简单的结构,它只需要一个枚举来表示当前状态。对于递归结构,您可能需要自定义堆栈。

在本节中,将展示一个将简单对象解析为自定义数据结构的示例。它需要处理3种状态。或者,您可以使用计数器来记录对String()的调用次数,并使用奇数/偶数来确定它是键还是值。

使用SAX API有时可能更困难。另一方面,它提供了更好的性能和更少的内存开销。


更新:2014/9/5

String()的基础上添加Key()事件的pull-request已经合并。新的接口将简化编写自定义处理程序。