我正在使用“rapidjson”解析一个 JSON 字符串。我正在研究以下 json 对象的 SAX 类型解析示例。
在此 SAX 类型解析中,rapidjson 调用在解析时收到的每种数据类型的事件处理程序。(作为 ( https://github.com/miloyip/rapidjson/blob/2e0b3de8d68758b2866fff5f047c893b8a1c4290/doc/sax.md的文档)
我如何区分给定元素是键和对应于该键的值?
我正在使用“rapidjson”解析一个 JSON 字符串。我正在研究以下 json 对象的 SAX 类型解析示例。
在此 SAX 类型解析中,rapidjson 调用在解析时收到的每种数据类型的事件处理程序。(作为 ( https://github.com/miloyip/rapidjson/blob/2e0b3de8d68758b2866fff5f047c893b8a1c4290/doc/sax.md的文档)
我如何区分给定元素是键和对应于该键的值?
您只能通过事件序列的顺序来区分键和值。
当Reader
(SAX Parser) 遇到 JSON 对象时,它会调用StartObject()
处理程序。然后会有一系列的键值对。键必须是String()
调用,但值可以是任何 JSON 值类型。最后它调用EndObject()
.
因此,您需要跟踪解析的状态。对于简单的结构,它只需要一个枚举来表示当前状态。对于递归结构,您可能需要自定义堆栈。
在本节中,它展示了一个将简单对象解析为自定义数据结构的示例。它需要处理 3 个状态。或者,您可以使用计数器来计算调用次数,String()
并使用奇数/偶数来确定它是键还是值。
有时使用 SAX API 可能会更加困难。另一方面,它提供了更好的性能和更少的内存开销。
更新:2014/9/5
一个添加Key()
事件的拉取请求String()
已经被合并。新接口将简化编写自定义处理程序。