What is the difference between JSON and Object Literal Notation?
有人能告诉我使用"对象文字符号"定义的javascript对象和JSON对象之间的主要区别是什么吗?
根据一本javascript书籍,它说这是一个使用对象表示法定义的对象:
1 2 3 4 | var anObject = { property1 : true, showMessage : function (msg) { alert(msg) } }; |
为什么在这种情况下它不是JSON对象?只是因为它不是用引号定义的?
让我们先澄清一下JSON实际上是什么。JSON是一种文本、语言独立的数据交换格式,很像XML、CSV或YAML。
数据可以以多种方式存储,但是如果它应该存储在文本文件中,并且可以被计算机读取,那么它需要遵循某种结构。JSON是定义这种结构的多种格式之一。
这些格式通常是语言无关的,这意味着它们可以由Java、Python、JavaScript、PHP处理,您可以将其命名。
相反,javascript是一种编程语言。当然,javascript也提供了一种定义/描述数据的方法,但是语法非常特定于javascript。
作为一个反例,python有元组的概念,它们的语法是
让我们看看JSON和JavaScript对象文本之间的语法差异。
JSON具有以下语法约束:
- 对象键必须是字符串(即用双引号
" 括起来的字符序列)。 - 这些值可以是:
- 一串
- 一个数字
- 一个(json)对象
- 数组
true false null
- 重复键(
{"foo":"bar","foo":"baz"} 产生未定义的、特定于实现的结果;JSON规范没有明确定义它们的语义。
在javascript中,对象文本可以
- 字符串文本、数字文本或标识符名称作为键(自ES6以来,现在还可以计算键,这引入了另一种语法)。
- 这些值可以是任何有效的javascript表达式,包括函数定义和
undefined 。 - 重复键产生定义的、指定的结果(在松散模式下,后一个定义替换前一个定义;在严格模式下,这是一个错误)。
知道了这一点,只要看看语法,您的示例就不是JSON,原因有两个:
但最重要的是,从一开始就重复我的解释:您在一个JavaScript上下文中。定义一个javascript对象。如果有,"json对象"只能包含在字符串中:
1 2 | var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON) var json = '{"foo": 452}'; // creates a string containing JSON |
也就是说,如果您在编写JavaScript源代码,而不处理字符串,那么就不处理JSON。也许您以JSON的形式接收数据(例如,通过Ajax或从文件中读取),但是一旦您或您使用的库解析了数据,它就不再是JSON了。
只是因为对象文本和JSON看起来很相似,这并不意味着您可以将它们互换命名。另请参见,没有"JSON对象"这样的东西。
JSON的语法更为有限,包括:
- 必须引用键值
- 字符串必须用
" 而不是' 引用。 - 您的值范围更有限(例如,不允许使用任何函数)
实际上没有"JSON对象"这样的东西。
JSON规范是将数据编码为字符串的语法。人们称之为"JSON对象"(在javascript中)实际上只是一个普通的javascript对象,它(可能)已从有效的JSON字符串中反序列化,并且可以很容易地作为有效的JSON字符串重新序列化。这通常意味着它只包含数据(而不包含函数)。它还意味着没有日期,因为JSON没有日期类型(可能是JSON最痛苦的事情;)
此外,(side rant…)当人们谈论"JSON对象"时,他们几乎总是指顶层具有"大括号"的数据。这与一个javascript对象很好地对应。但是,JSON规范并不要求在JSON字符串的顶层有一个"大括号"对象。在顶层有一个列表,甚至只有一个值,这是完全有效的JSON。因此,虽然每个"JSON对象"都对应于有效的JSON,但并非所有有效的JSON字符串都对应于我们称之为"JSON对象"的内容!(因为字符串可以表示列表或原子值)
根据javascript中的json,
JSON is a subset of the object
literal notation of JavaScript.
换句话说,有效的JSON也是有效的JavaScript对象文字符号,但不一定是相反的。
除了阅读文档之外,正如@filix king建议的那样,我还建议使用jsonlint在线json验证器。这就是我了解到JSON对象的键必须是字符串的方式。
??json:XML的无脂肪替代品好的。
JSON已经被广泛采用,人们发现它使得生成分布式应用程序和服务变得容易得多。JSON的官方互联网媒体类型是
?javascript对象表示法(
The JSON object is a single object that contains two functions, parse and stringify, that are used to parse and construct JSON texts.
Ok.
- JSON.stringify produces a String that conforms to the following JSON grammar.
- JSON.parse accepts a String that conforms to the JSON grammar.
The parseJSON method will be included in the
Fourth Edition of ECMAScript . In the meantime, a JavaScript implementation is available at json.org.Ok.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var objLiteral = {foo: 42}; // JavaScript Object console.log('Object Literal : ', objLiteral ); // Object {foo: 42}foo: 42__proto__: Object // This is a JSON String, like what you'd get back from an AJAX request. var jsonString = '{"foo": 452}'; console.log('JOSN String : ', jsonString ); // {"foo": 452} // This is how you deserialize that JSON String into an Object. var serverResposnceObject = JSON.parse( jsonString ); console.log('Converting Ajax response to JavaScript Object : ', serverResposnceObject); // Object {foo: 42}foo: 42 __proto__: Object // And this is how you serialize an Object into a JSON String. var serverRequestJSON = JSON.stringify( objLiteral ); console.log('Reqesting server with JSON Data : ', serverRequestJSON); // '{"foo": 452}' |
JSON是JavaScript的子集。javascript是从ecmascript编程语言标准派生而来的。好的。
?ECMAScript好的。
ecmascript已经成为世界上使用最广泛的通用编程语言之一。它被称为嵌入在Web浏览器中的语言,但也被广泛应用于服务器和嵌入式应用程序。ecmascript基于几种原始技术,最著名的是EDOCX1(Netscape Communications)和EDOCX1(Microsoft Corporation)。尽管在1994年之前,欧洲计算机制造商协会被称为"欧洲计算机制造商协会",但在1994年之后,当该组织成为全球性组织时,由于历史原因,"欧洲计算机制造商协会"的商标一直保留着。好的。
ecmascript是一种语言,而javascript、jscript甚至actionscript被称为
Dialects have been derived from the same language. They are are quite similar to each other as they have been derived from the same language but they have undergone some changes.
A dialect is a variation in the language itself. It is derived from a single language.Ok.
- SQL Language - Hibernate MySQL Dialect, Oracle Dialect,.. which have some changes or added functionality.
有关用户的浏览器和计算机的信息。好的。
1 | navigator.appName //"Netscape" |
EcmaScript是构成JavaScript基础的脚本语言。
xykb
OCx1〔11〕。xykbeddocx1〔12〕OCx1〔13〕。xykbeddocx1〔12〕OCx1〔15〕ODOCx1〔12〕OCx1〔17〕ODOCx1〔12〕OCx1〔19〕ODOCx1〔20〕OCx1〔21〕ODOCx1〔20〕OCx1〔23〕ODOCx1〔20〕OCx1〔25〕ODOCx1〔20〕OCx1〔27〕ODOCx1〔20〕好的。
注意事项?ECMAScript第四版未出版,因为该作品不完整。好的。
JSON defines a small set of formatting rules for the portable representation of structured data.
Ok.
???????密钥值必须上市,只读字符串的方法是允许的钥匙。如果你使用比其他字符串,它会转化到字符串。但不推荐使用的键比其他字符串’s example一样。检查这个
/好的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | var storage = { 0 : null, 1 :"Hello" }; console.log( storage[1] ); // Hello console.log( JSON.stringify( storage ) ); // {"0":null,"1":"Hello","2":"world!"} var objLiteral = {'key1':'val1'}; var arr = [10, 20], arr2 = [ 'Yash', 'Sam' ]; var obj = { k: 'v' }, obj2 = { k2: 'v2' }; var fun = function keyFun() {} ; objLiteral[ arr ] = 'ArrayVal'; objLiteral[ arr2 ] = 'OverridenArrayVal'; objLiteral[ obj ] = 'ObjectVal'; objLiteral[ obj2 ] = 'OverridenObjectVal'; objLiteral[ fun ] = 'FunctionVal'; console.log( objLiteral ); // Object {key1:"val1", 10,20:"ArrayVal", Yash,Sam:"OverridenArrayVal", [object Object]:"OverridenObjectVal", function keyFun() {}:"FunctionVal"} console.log( JSON.stringify( objLiteral ) ); // {"key1":"val1","10,20":"ArrayVal","Yash,Sam":"OverridenArrayVal","[object Object]":"OverridenObjectVal","function keyFun() {}":"FunctionVal"} console.log( JSON.parse( JSON.stringify( objLiteral ) ) ); // Object {key1:"val1", 10,20:"ArrayVal", Yash,Sam:"OverridenArrayVal", [object Object]:"OverridenObjectVal", function keyFun() {}:"FunctionVal"} console.log('Accessing Array Val : ', objLiteral[ [10,20] ] ); console.log('Accessing Object Val : ', objLiteral[ '[object Object]' ] ); console.log('Accessing Function Val : ', objLiteral[ 'function keyFun() {}' ] ); |
???????JSON字符串必须与上市的"不"。一个字符串是非常多的像一个C或Java的字符串。字符串应该是包装在双层quotes。。。。。。。
/好的。
- Literals are fixed values, not variables, that you literally provide in your script.
- A string is a sequence of zero or more characters wrapped in quotes with backslash escapement, the same notation used in most programming languages.
- ?? - Special Symbols are allowed in String but not recomended to use.
- \" - Special characters can be escaped. But not recomended to escape (') Single Quotes.
In Strict mode it will throw and Error -SyntaxError: Unexpected token ' in JSON Check with this code
{"Hai\" over online JSON Edtions.
Team ??":5,"Bye \'": 7 }Modes notStrict , Strinct . Ok.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var jsonString ="{'foo': 452}"; // {'foo': 452} var jsonStr = '{"foo": 452}'; // {"foo": 452} JSON.parse( jsonString ); // Unexpected token ' in JSON at position 1(…) JSON.parse( jsonStr ); // Object {foo: 452} objLiteral['key'] = 'val'; // Object {foo: 42, key:"val"} objLiteral.key2 = 'val'; // objLiteral.key 3 - SyntaxError: Invalid or unexpected token objLiteral['key 3'] = 'val'; // Object {"foo":"42", key:"val", key2:"val","key?3":"val"} JSON.stringify( objLiteral ); // {"foo":"42","key":"val","key2":"val","key 3":"val"} |
面向属性的访问器提供访问的对象的属性通过使用点notation或notation支架。
/好的。
???????你有一个更有限的范围内的值(例如,好的函数允许的)。A的值可以是一个字符串中的双quotes,number,布尔,null,对象或数组。这些结构可以套式。
/好的。
1 2 3 4 5 6 7 8 9 10 | var objLiteral = {}; objLiteral.funKey = function sayHello() { console.log('Object Key with function as value - Its outcome message.'); }; objLiteral['Key'] = 'Val'; console.log('Object Literal Fun : ', objLiteral ); // Object Literal Fun : Object {Key:"Val"}Key:"Val"funKey: sayHello()__proto__: Object console.log( JSON.stringify( objLiteral ) ); // {"Key":"Val"} |
/好的。
???????
/好的。
JavaScript是一个dynamically型语言。这意味你没有到指定的数据类型的一个变量,当你declare它,和数据类型是自动转换为需要在脚本的执行。
/好的。
/好的。
1 2 3 4 5 6 7 8 9 10 11 12 13 | '37' - 7 // 30 '37' + 7 //"377" +'37' + 7 // 44 +'37' // 37 '37' //"37" parseInt('37'); // 37 parseInt('3.7'); // 3 parseFloat(3.7); // 3.7 // An alternative method of retrieving a number from a string is with the + (unary plus) operator: +'3.7' // 3.7 |
/好的。
一是面向结构的represented作为一对卷曲蓬松的brackets surrounding零或多个名称/值对(或成员)。a name is a 的字符串。一个单一的结肠是继each name,切割的名称从值。一个单一的逗号,separates A值,从下面的 name。在名称中的对象应该是独特的。
/好的。
prototype ECMAScript支持型的继承。每一个constructor安有相关prototype,和每一个对象的创建中,constructor有安隐参考的prototype(称为面向’s prototype)伴constructor ITS。。。。。。。furthermore,A prototype可能有一个非零的参考prototype隐式运算放大器,和SO;这是被称为"prototype链。
/好的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | { "Image": { "Width": 800, "Height": 600, "Title": "View from 15th Floor", "Thumbnail": { "Url": "http://www.example.com/image/481989943", "Height": 125, "Width": 100 }, "Animated" : false, "IDs": [116, 943, 234, 38793] } } |
它的图像成员是一个对象,其缩略图成员是一个对象,并且其ID成员是一个数字数组。
There is really no such thing as a"JSON Object".
真的?
据我所知,主要区别在于灵活性。
JSON是"javascript对象表示法"的一种包装器,它强制用户遵守更严格的定义对象的规则。它通过限制javascript对象符号特性提供的可能的对象声明方式来实现这一点。
因此,我们有一个更简单、更标准的对象,更适合于平台之间的数据交换。
因此,在上面的示例中,NewObject基本上是使用javascript对象表示法定义的对象;但它不是"有效"的JSON对象,因为它不遵循JSON标准所要求的规则。
此链接也非常有用:http://msdn.microsoft.com/en-us/library/bb299886.aspx
首先,您应该知道什么是JSON:
它是语言无关的数据交换格式。JSON的语法是受javascript对象文字符号的启发,但它们之间存在差异。
例如,在JSON中,所有键都必须被引用,而在对象文本中,这是不必要的:
//JSON:"foo":"bar"
//对象文本:var o=foo:"bar"JSON上的引号是强制的,因为在javascript中(更确切地说,在ecmascript 3rd.edition中),不允许将保留字用作属性名,例如:
var o=if:"foo";//ES3中的syntaxError但是,使用字符串文字作为属性名(引用属性名)不会出现问题:
var o="if":"foo"因此,为了"兼容性"(也许简单的评估?)报价是强制性的。
JSON中的数据类型也限制为以下值:
一串数对象数组字面如下:真假无效的字符串语法发生变化。它们必须用双引号分隔,而在JavaScript中,您可以互换使用单引号或双引号。
//无效的JSON:"foo":'bar'接受的JSON数字语法也会改变,在JavaScript中,您可以使用十六进制文字,例如0xFF,或者(臭名昭著的)八进制文字,例如010。在JSON中,只能使用十进制文本。
//无效的JSON:{"FO":0xFF}