java中json不确定多少层
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中json不确定多少层相关的知识,希望对你有一定的参考价值。
参考技术A 使用递归函数。java中json不确定多少层需要使用递归函数,要获取的值就需要一个路径来表示,路径可以用数组来标记,这个Json字符串有多层嵌套,还有不固定的元素。只要学会了方法,不管多少层也是能分析出来的。最低有效 JSON 是多少?
【中文标题】最低有效 JSON 是多少?【英文标题】:What is the minimum valid JSON? 【发布时间】:2013-08-27 11:38:11 【问题描述】:我已经仔细阅读了 JSON 描述 http://json.org/,但我不确定我是否知道这个简单问题的答案。什么字符串是最小可能的有效 JSON?
"string"
字符串是有效的 JSON 吗?
42
是简单数字有效的 JSON 吗?
true
的布尔值是有效的 JSON 吗?
空对象是有效的 JSON 吗?
[]
空数组是有效的 JSON 吗?
【问题讨论】:
在jsonlint.com测试,最后两个有效,其他无效。 一些 JSON 解析器需要一个数组或一个对象。他们抱怨的只是一个数字或一个字符串。 到目前为止,这些都是有效的 Is this simple string considered valid JSON?的可能重复 简短回答 - 【参考方案1】:在撰写本文时,JSON 仅在 RFC4627 中进行了描述。它将 JSON 文本描述为(在“2”的开头)是一个序列化的对象或数组。
这意味着只有 和
[]
在符合该标准的解析器和字符串化器中是有效的、完整的 JSON 字符串。
然而,ECMA-404 的引入改变了这一点,更新的建议 can be read here。关于这个问题,我也 written a blog post。
然而,为了进一步混淆这个问题,Web 浏览器中可用的 JSON
对象(例如 JSON.parse()
和 JSON.stringify()
)是 standardised in ES5,它清楚地定义了可接受的 JSON 文本,如下所示:
本规范中使用的 JSON 交换格式与 RFC 4627 所描述的完全相同,但有两个例外:
ECMAScript JSON 语法的*** JSONText 生成可以由任何 JSONValue 组成,而不是被限制为 RFC 4627 指定的 JSONObject 或 JSONArray。
剪掉
这意味着 JSON 对象接受 所有 JSON 值(包括字符串、空值和数字),即使 JSON 对象在技术上遵循 RFC 4627。
请注意,您可以因此在符合标准的浏览器中通过JSON.stringify(5)
对数字进行字符串化,这将被另一个遵循 RFC4627 但没有上面列出的特定例外的解析器拒绝。 Ruby,例如,would seem to be one such example which only accepts objects and arrays as the root。另一方面,PHP specifically adds the exception 表示“它还将对标量类型和 NULL 进行编码和解码”。
【讨论】:
@amdorra:你能说得更具体些吗? JSON 不是名词,所以“a JSON”是没有意义的。任何“JSON 值”都是“JSON 值”,但解析器通常期望该 RFC 中定义的“JSON 文本”。 我不好我会删除我的答案然后 @jmoreno 你能澄清你的评论吗?你是说true
、false
或 null
单独是一个有效的 JSON 文本吗?您能否引用一个来源,因为这与这里的大多数其他答案/cmets 相矛盾?
@jmoreno:第 2 节中的引用肯定是“JSON 文本是序列化的对象或数组”。反对吗? JSON Lint 也不认为非数组或对象是有效的。字符串是否是有效的 JSON 文字没有争议。这是关于一个字符串本身是否有效的问题。【参考方案2】:
根据RFC 4627 中的旧定义(2014 年 3 月被 RFC 7159 废弃),这些都是有效的“JSON 值”,但只有最后两个构成完整的“JSON 文本”:
JSON 文本是一个序列化的对象或数组。
根据所使用的解析器,可能会接受单独的“JSON 值”。例如(坚持“JSON 值”与“JSON 文本”术语):
现在在现代浏览器中标准化的JSON.parse()
函数接受任何“JSON 值”
PHP 函数 json_decode
在 5.2.0 版中引入,仅接受整个“JSON 文本”,但在 5.2.1 版中被修改为接受任何“JSON 值”
Python 的json.loads
根据示例on this manual page 接受任何“JSON 值”
http://jsonlint.com 的验证器需要完整的“JSON 文本”
Ruby JSON 模块将只接受完整的“JSON 文本”(至少根据 cmets on this manual page)
这种区别有点像“XML 文档”和“XML 片段”之间的区别,尽管从技术上讲 <foo />
是一个格式良好的 XML 文档(最好写成 <?xml version="1.0" ?><foo />
,但正如所指出的那样在 cmets 中,<?xml
声明在技术上是可选的)。
【讨论】:
XML 比较可能不合适,因为没有可选 XML 声明的 XML 文档完全有效。请参阅w3.org/TR/xml/#sec-well-formed 上的 XML 推荐 @Gunther 啊,是的,我忘记了它在技术上是可选的,尽管非常鼓励。 @Gunther:挑剔:<foo />
是一个格式良好的 XML 文档,但不是有效 的。 (但<?xml version="1.0" ?><foo />
也是如此。)
@ruakh 有趣的是,the definition here 暗示 XML 只能对 DTD “有效”,这意味着很少有 XML 文档是有效的,因为 DTD 在实践中很少被编写和声明(与模式相比) XSD 或 RelaxNG 等定义格式)。我正在检查,因为如果您可以在不引用外部架构的情况下有效,那么<foo />
可能是也可能不是有效针对特定架构,但那是不是该标准规定的。【参考方案3】:
是的,是的,是的,是的,是的。它们都是有效的 JSON 值文字。
不过,官方RFC 4627表示:
JSON 文本是一个序列化的对象或数组。
所以一个完整的“文件”应该由一个对象或数组作为最外层的结构,当然也可以是空的。然而,许多 JSON 解析器也接受原始值作为输入。
【讨论】:
【参考方案4】:ecma 规范可能对参考有用:
http://www.ecma-international.org/ecma-262/5.1/
解析函数解析 JSON 文本(JSON 格式的字符串)并生成 ECMAScript 值。这 JSON 格式是 ECMAScript 文字的受限形式。 JSON 对象被实现为 ECMAScript 对象。 JSON 数组被实现为 ECMAScript 数组。 JSON 字符串、数字、布尔值和 null 被实现为 ECMAScript 字符串、数字、布尔值和 null。 JSON 使用更有限的一组空白字符 比 WhiteSpace 并允许 Unicode 代码点 U+2028 和 U+2029 直接出现在 JSONString 文字中 不使用转义序列。解析的过程与 11.1.4 和 11.1.5 类似,受限于 JSON 语法。
JSON.parse("string"); // SyntaxError: Unexpected token s
JSON.parse(43); // 43
JSON.parse("43"); // 43
JSON.parse(true); // true
JSON.parse("true"); // true
JSON.parse(false);
JSON.parse("false");
JSON.parse("trueee"); // SyntaxError: Unexpected token e
JSON.parse(""); //
JSON.parse("[]"); // []
【讨论】:
虽然是一个有用的参考,但它是特定 JSON 解析器(ECMAScript 标准中定义的解析器)的规范,而不是针对格式本身的规范。 json.org 明确指出 JSON “完全独立于语言”,因此没有一个正确的解析器。 JavaScript/ECMAScipt 是 JSON 的灵感来源,也是它的用户,但不是它的“家”。 JSON 派生自 ECMAScript(所有早期版本)中的对象文字表示法,但与它不同。JSON.parse
函数随后被添加到基于 Crockford 语法和 RFC 的更高版本的 ECMAScript 标准中。
你应该这样做JSON.parse("\"string\"");
【参考方案5】:
JSON 代表 JavaScript 对象表示法。只有 和
[]
定义了一个Javascript 对象。其他示例是值文字。 Javascript 中有用于处理这些值的对象类型,但表达式 "string"
是字面值而不是对象的源代码表示。
请记住,JSON 不是 Javascript。它是一种表示数据的符号。它具有非常简单和有限的结构。 JSON 数据使用,:[]
字符构成。您只能在该结构中使用文字值。
服务器以对象描述或文字值进行响应是完全有效的。所有 JSON 解析器都应该被处理为只处理一个文字值,但只处理一个值。 JSON 一次只能表示一个对象。因此,如果服务器要返回多个值,则必须将其构造为对象或数组。
【讨论】:
我认为从这个方向接近答案比它澄清的更多:名称的起源与标准的细节无关,JavaScript 中可用的类型可能是这些类型的灵感在 JSON 中,但不要求它们匹配。 json.org 上的介绍清楚地表明了这一点:“JSON 是一种完全独立于语言的文本格式” @IMSoP 我完全同意。我将 Javascript 类型与 JSON 混合,这是不正确的。我会更新我的答案。【参考方案6】:var x;
JSON.stringify(x); // will output ""
所以你的答案是""
,它表示一个空对象。
【讨论】:
FWIW,在 Chrome 中,这给出了undefined
,而不是“”`【参考方案7】:
只需按照json.org 页面上给出的铁路图进行操作即可。 [] 和 是最小可能的有效 JSON 对象。所以答案是 [] 和 。
【讨论】:
这不是 FSM,而是语法。它似乎并没有表明哪个生产是开始规则。如果开始规则是array
和 object
你是对的,但期望 value
是开始是合理的。
对我来说看起来相当简单。道格拉斯·克罗克福德(Douglas Crockford)这样称呼他们,我们总是从左边开始,沿着轨道向右走。最小的轨道给出了最小的有效 JSON。
我反对的不是您对任何特定语法规则的解释,而是您选择了两个规则并假设一个只能从这些规则开始,而不是从其他规则开始。如果您查看 values
规则而不是(或除了)array
和 object
规则,那么独立的数字和字符串是有效的 JSON 文档。
-1。首先,正如@delnan 指出的那样,json.org 的图表中没有任何内容表明完整的 JSON 文本必须是对象或数组;你已经任意选择了这两个,而不是基于 json.org 上的任何内容。其次,对术语的挑剔:[]
,虽然每个规范下的有效 JSON 文本曾经对此事有过意见,但它不是“有效的 JSON 对象”,因为它不是 JSON 对象。 JSON 中的“对象”特指
表示法; JSON 数组不是 JSON 对象。【参考方案8】:
Internet 上至少有四个文档可以被视为 JSON 标准。引用的 RFC 都描述了 mime 类型 application/json
。以下是每个人对***值的看法,以及顶部是否允许除对象或数组以外的任何内容:
RFC-4627:没有。
JSON 文本是一个标记序列。该组令牌包括六个 结构字符、字符串、数字和三个文字名称。
JSON 文本是一个序列化的对象或数组。
JSON-text = 对象/数组
请注意,RFC-4627 被标记为“信息性”而不是“建议标准”,并且它已被 RFC-7159 废弃,而 RFC-7159 又被 RFC-8259 废弃。
RFC-8259:是的。
JSON 文本是一个标记序列。该组令牌包括六个 结构字符、字符串、数字和三个文字名称。
JSON 文本是一个序列化值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或 大批。仅生成对象或数组的实现 要求 JSON 文本将是可互操作的,因为所有 实现将接受这些作为符合 JSON 文本。
JSON-text = ws 值 ws
RFC-8259 日期为 2017 年 12 月,标记为“互联网标准”。
ECMA-262:是的。
JSON 句法语法根据 JSON 词法定义的标记定义了有效的 JSON 文本 语法。语法的目标符号是JSONText。
语法 JSON文本:
JSON 值
JSON 值:
JSONNullLiteral
JSONBooleanLiteral
JSON 对象
JSON数组
JSON字符串
JSON 编号
ECMA-404:是的。
JSON 文本是由符合 JSON 值的 Unicode 代码点形成的标记序列 语法。标记集包括六个结构标记、字符串、数字和三个文字名称标记。
【讨论】:
以上是关于java中json不确定多少层的主要内容,如果未能解决你的问题,请参考以下文章
确定存储在 DocumentDB 中的 JSON 文档的大小