2014-07-17 19 views
2

我正在使用“rapidjson”解析JSON字符串。 我正在学习下面的JSON对象的SAX类型解析的例子。如何使用rapidjson解析JSON字符串时区分键和值?

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

在这种SAX类型解析rapidjson如收到消磨解析调用每个数据类型的事件处理程序。(截至(https://github.com/miloyip/rapidjson/blob/2e0b3de8d68758b2866fff5f047c893b8a1c4290/doc/sax.md

文件我怎样才能区分是给定的元素是关键和价值对应于该关键?

回答

0

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

Reader(SAX帕尔斯呃)遇到一个JSON对象,它调用处理程序的StartObject()。然后会有一系列键值对。密钥必须是String()调用,但该值可以是任何JSON值类型。最后它叫EndObject()

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

this section中,它显示了将简单对象解析为自定义数据结构的示例。它需要处理3个州。或者,您可以使用计数器拨打String()的电话号码,并使用奇数/偶数来确定它是键还是值。

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


更新:2014年9月5日

上拉要求其到String()增加了一个Key()事件附加一直merged。新界面应简化编写自定义处理程序。

+0

非常感谢您的答案。我可能会使用enum按照您的示例中的建议。 – balaji