关于javascript:JSON和Object Literal Notation有什么区别?

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有元组的概念,它们的语法是(x, y)。javascript没有类似的功能。

让我们看看JSON和JavaScript对象文本之间的语法差异。

JSON具有以下语法约束:

  • 对象键必须是字符串(即用双引号"括起来的字符序列)。
  • 这些值可以是:
    • 一串
    • 一个数字
    • 一个(json)对象
    • 数组
    • true
    • false
    • null
  • 重复键({"foo":"bar","foo":"baz"}产生未定义的、特定于实现的结果;JSON规范没有明确定义它们的语义。

在javascript中,对象文本可以

  • 字符串文本、数字文本或标识符名称作为键(自ES6以来,现在还可以计算键,这引入了另一种语法)。
  • 这些值可以是任何有效的javascript表达式,包括函数定义和undefined
  • 重复键产生定义的、指定的结果(在松散模式下,后一个定义替换前一个定义;在严格模式下,这是一个错误)。

知道了这一点,只要看看语法,您的示例就不是JSON,原因有两个:

  • 您的键不是字符串(文本)。它们是标识符名称。
  • 不能将函数作为值分配给"json对象"(因为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的官方互联网媒体类型是application/jsonRFC 4627。JSON文件名使用扩展名.json。好的。

    ?javascript对象表示法(JSON是一种轻量级的、基于文本的、与语言无关的数据交换格式。JSON已经被用来在用任何编程语言编写的应用程序之间交换数据。好的。

    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"。好的。

    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基础的脚本语言。JavaScriptlanguage resources。好的。

    xykb ECMA-262 xykbeddocx1〔10〕
    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一样。检查这个{ 'key':'val' }RFC 4627 - jsonformatter

    /好的。

    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\"
    Team ??":5,"Bye \'": 7 }
    over online JSON Edtions. ModesnotStrict,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"}
  • enter image description here

    /好的。

    ???????JavaScript是最流行的实现在ECMAScript标准。 在核特征的研究是基于JavaScript的脚本语言JavaScript的标准,但也有其他额外的特征,这是不在ECMA规范/标准。每一个有一个浏览器的JavaScript interpreter。。。。。。。

    /好的。

    JavaScript是一个dynamically型语言。这意味你没有到指定的数据类型的一个变量,当你declare它,和数据类型是自动转换为需要在脚本的执行。

    /好的。

    Literals

    /好的。

    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

    Object literalsRFC 7159

    /好的。

    一是面向结构的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链。

    /好的。

    >   </p>
<p>/好的。  <P>在基于类的面向对象语言中,通常状态由实例承载,方法由类承载,继承仅具有结构和行为。在EcmaScript中,状态和方法由对象携带,结构、行为和状态都是继承的。好的。<P>原型是用于在EcmaScript中实现结构、状态和行为继承的对象。当构造函数创建对象时,该对象隐式引用构造函数的关联原型以解析属性引用。构造函数的关联原型可以被程序表达式constructor.prototype引用,添加到对象原型的属性通过继承由共享原型的所有对象共享。好的。好啊。</p>
<hr><P>对于那些仍然认为RFC比博客和基于观点的误解更重要的人,让我们试着回答澄清一些观点。我不会重复前面答案中已经提到的所有正确的差异,这里我只是试着总结一些关键部分RFC7159的附加值。</P><P>摘自https://tools.ietf.org/html/rfc7159</P></p>
<li>javascript对象表示法(JSON)是结构化数据的序列化。它是从对象派生的在ecmascript编程中定义的javascript文本语言标准,第三版[ECMA-262]。</li>
<li>JSON可以表示四种基本类型(字符串、数字、布尔值,和两个结构化类型(对象和数组)。</li>
<li>对象是零个或多个名称/值的无序集合对,其中名称是字符串,值是字符串、数字,布尔值、空值、对象或数组。</li>
<li>begin object=ws%x7b ws;左花括号</li>
<li>结束对象=ws%x7d ws;右花括号</li>
<li>JSON值必须是对象、数组、数字或字符串,或者以下三个文字名称:假、空、真</li>
<li>对象结构表示为一对花括号。</li>
<li>对象中的名称应该是唯一的。对象=开始对象[成员*(值分隔符成员)]结束对象</li>
<li>名称都是唯一的对象在意义上是可互操作的。所有接收该对象的软件实现都将同意名称值映射。当对象中的名称不是唯一的,接收这样一个对象的软件的行为是不可预知的。</li>
<li><P>示例(摘自RFC第12页)</P><P>这是一个JSON对象:</P><br />
<blockquote>
<div class=

    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}