是否可以在不使用递归的情况下编写JSON解析器?

问题描述:

是否可以在不使用递归的情况下编写JSON解析器?如果是这样,你会建议什么方法?是否可以在不使用递归的情况下编写JSON解析器?

它可能通过等价的迭代实现重现任何递归代码。

这个问题介绍了这个相当不错:Is it possible to remove recursion from this function?

+1

这是错的。所有你需要的是一个堆栈。 进入递归调用是在栈上添加数据,然后离开将其删除。 – Scharron 2010-07-20 15:27:02

+1

事实上,通常情况下你会得到的代码不如递归对应的代码更优雅,也更难以理解。 – NullUserException 2010-07-20 15:28:08

+0

你基本上是对的。这是我编程课程中的一整章:从递归转换为迭代。 – 2010-07-20 15:29:15

我同意James - 任何递归代码理论上可以使用迭代的方法来实现。在引用的链接上描述的堆栈方法是一个有效的选项。另一种方法是,您可以将其深度编码为n,然后将其限制为所述深度的明显风险。

不知道更多关于您尝试运行JSON处理代码的环境和约束条件,很难说哪种方法最适合。有些事情要考虑:

  • 递归代码通常是简单的跟随,如果你可以管理(在几乎任何语言与例99%兼容在那里处理JSON)使用固定的深度可以
  • 迭代代码“效率更高”,因为它不需要太多的堆栈使用,但不能很好地扩展到n深度场景
  • 基于堆栈的代码可以处理n深度场景,但可能不像其他场景那么直观程序员

此外,还可以对树结构进行线性化(JSON的对象图是隐含的,假定数组只能有一个“数组”的虚拟根)。这允许采用平坦流处理方法。如果您进一步注入人造代币(如DOWNUP),它可以非常清晰易读。这是编译器设计和语言分析中出现的问题,但这里可能有助于理解。