JSON中是否存在数组深度限制?

时间:2017-02-08 15:07:08

标签: arrays json

使用 array-depth ,我不是指数组中元素的数量,但这个构造在这里:

[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]

我在test suiteJSON_checker中偶然发现了这一点。

脚本pass2.json有这个(19个左括号):

[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]

正如测试脚本的名称所暗示的那样,预计会通过。

另一个来自fail18.json,预计会失败。它有20个开口括号。但是,ECMA-404还没有那么对阵列说得多:

  

数组结构是一对围绕零个或多个值的方括号标记。价值观是   被逗号隔开。值的顺序很重要。

是否存在我错过的限制或测试脚本错误?

1 个答案:

答案 0 :(得分:4)

正如您已经指出的那样,ECMA-404 JSON Data Interchange Format没有提到对嵌套级别的任何限制,只是数组/对象可以嵌套:

  

因为对象和数组可以嵌套,所以可以表示树和其他复杂的数据结构。

     

JSON值可以是对象,数组,数字,字符串, truefalsenull

     

数组结构是一对零或更多的方括号令牌   

您所参考的测试套装中的限制似乎更多是设置程序内存使用限制的措施。请注意JSON_checker.c中函数 new_JSON_checker 的定义,其中一个源文件也可用on github。在注释中解释了使用 depth 参数:

  

它需要一个深度参数来限制最大嵌套级别。

然后代码使用此参数进行内存分配:

jc->stack = (int*)calloc(depth, sizeof(int));

范围检查在别处进行,评论内容为:

  

如果有溢出,则返回false。

因此,总而言之,这似乎是一个特定于此特定测试套件的实用指标。

很明显,其他解析器接受更高价值的深度:尝试例如jsonlint.com