Javascript对象与JSON

tes*_*dtv 199 javascript json

我想明白Javascript对象和JSON字符串之间的基本差异.

假设我创建了以下JS变量:

var testObject = {one: 1,"two":2,"three":3};
Run Code Online (Sandbox Code Playgroud)

Q1.键/属性名称是否有/无引号?(例如"one" : 1)

如果是,有什么区别?

Q2:如果我使用转换上述对象JSON.stringify(testObject),原始JS对象和JSON之间有什么区别?

我觉得他们差不多了.请详细说明.

问题3:对于解析JSON字符串,是推荐的方法吗?

var javascriptObj = JSON.parse(jSonString);
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 229

  1. 键/属性名称是否有/无引号?

    你需要使用对象的文字符号时放在引号的关键唯一的一次,其中关键包含特殊字符(if,:,-等).值得注意的是,JSON中的键必须引号括起来.

  2. 如果我使用上面的对象转换为JSON var jSonString = JSON.stringify(testObject);,那么2(JS obj和JSON)有什么区别?

    JSON是一种数据交换格式.它是一个标准,它描述了有序列表和无序映射,字符串布尔值和数字如何用字符串表示.就像XML和YAML是一种在语言之间传递结构化信息的方式一样,JSON是相同的.另一方面,JavaScript对象是物理类型.就像PHP数组,C++类/结构一样,JavaScript对象是JavaScript内部的类型.

    这是一个故事.让我们想象一下,你从商店购买了一些家具,并希望它能够送到.然而,库存中唯一剩下的是显示器型号,但您同意购买它.

    在商店里,你购买的抽屉柜是一个生物:

    var chestOfDrawers = {
        color: "red",
        numberOfDrawers: 4
    }
    
    Run Code Online (Sandbox Code Playgroud)

    但是,你不能在帖子中发送抽屉柜,所以你要拆除它(阅读,字符串化).现在它在家具方面毫无用处.它现在是JSON.它采用扁平包装形式.

    {"color":"red","numberOfDrawers":4}
    
    Run Code Online (Sandbox Code Playgroud)

    当你收到它,然后你重建抽屉柜(阅读,解析它).它现在回到了一个对象形式.

    JSON/XML和YAML背后的原因是使数据能够以参与语言可以理解的格式在编程语言之间传输; 你不能直接给PHP或C++你的JavaScript对象; 因为每种语言都表示不同的对象.但是,因为我们已经将对象字符串化为JSON表示法; 即,一种表示数据的标准化方法,我们可以将对象的JSON 表示传递给另一个语言(C++,PHP),它们可以根据对象的JSON表示重新创建我们拥有的JavaScript 对象.

    请务必注意,JSON不能表示函数或日期.如果尝试使用函数成员对对象进行字符串化,则将从JSON表示中省略该函数.日期将转换为字符串;

    JSON.stringify({
        foo: new Date(),
        blah: function () { 
            alert('hello');
        }
    }); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 对于解析JSON字符串,是推荐的方法吗? var javascriptObj = JSON.parse(jSonString);

    是的,但是较旧的浏览器本身不支持JSON(IE <8).要支持这些,您应该包括json2.js.

    如果你正在使用jQuery,你可以调用jQuery.parseJSON(),JSON.parse()如果支持它将在底层使用,否则将回退到自定义实现来解析输入.

  • @testndtv你错过了这一点 - 虽然在纸上(或在屏幕上)JSON字符串和JS对象的_display_可能_look_相同,但它们不是一回事.JSON只是一种将对象打包成字符串的方法,因此它可以在某处转移,然后解压缩回一个对象. (4认同)
  • @Matt你先生,是af#king genius!您的解释是现实的,清晰,简洁,易于理解.我希望你是我的JavaScript /编程导师. (4认同)
  • @Growler:如果需要在服务器上“生成”“东西”,通常我使用JSON,而如果“源”只是按原样提供服务,则通常使用js文件。另一个大的区别是您是否需要包含函数和/或日期,因为JSON无法表示它们,因此您必须诉诸于提供JS文件。如果仍然不确定,请随时在Stack Overflow上作为一个单独的问题提问(显示您需要提供的内容来表示您的对话框),并向我提供链接;我很乐意仔细看看! (2认同)
  • @Matt 真的很喜欢家具的比喻。想看更多这样的,更通俗易懂的,赶紧抢了,忘不了。 (2认同)

Ben*_*Lee 30

Q1:在javascript中定义对象文字时,键可能包含或不包括引号.没有区别,除了引号允许您指定某些键,如果您裸露尝试它们将导致解释器无法解析.例如,如果您想要一个只是感叹号的键,则需要引号:

a = { "!": 1234 } // Valid
a = { !: 1234 } //  Syntax error
Run Code Online (Sandbox Code Playgroud)

但是,在大多数情况下,您可以省略对象文字上的键周围的引号.

Q2:JSON实际上是一个字符串表示.它只是一个字符串.所以,考虑一下:

var testObject = { hello: "world" }
var jSonString = JSON.stringify(testObject);
Run Code Online (Sandbox Code Playgroud)

既然testObject是一个真实的对象,你可以在它上面调用属性,并做任何你可以用对象做的事情:

testObject.hello => "world"
Run Code Online (Sandbox Code Playgroud)

另一方面,jsonString只是一个字符串:

jsonString.hello => undefined
Run Code Online (Sandbox Code Playgroud)

请注意另一个区别:在JSON中,必须引用所有键.这与对象文字形成鲜明对比,根据我在Q1中的解释,通常可以省略引号.

Q3.您可以使用解析JSON字符串JSON.parse,这通常是最好的方法(如果浏览器或框架提供它).你也可以使用,eval因为JSON是有效的javascript代码,但推荐使用前一种方法有很多原因(eval有很多令人讨厌的问题).


min*_*ins 9

JSON解决了问题

假设您想要在两台计算机之间交换常规JavaScript对象,并设置两条规则:

  • 传输的数据必须是常规字符串.
  • 只能交换属性,不传输方法.

现在,您在第一台主机上创建两个对象:

var obj1 = { one: 1,"two":2,"three":3 }; // your example
var obj2 = { one: obj1.one, two: 2, three: obj1.one + obj1.two };
Run Code Online (Sandbox Code Playgroud)

如何将这些对象转换为字符串以传输到第二个主机?

  • 对于第一个对象,您可以发送从字面定义获得的字符串'{ one: 1,"two":2,"three":3 }',但实际上您无法读取文档的脚本部分中的文字(至少不容易).所以,obj1obj2必须实际处理方式相同.
  • 您需要枚举所有属性及其值,并构建类似于对象文字的字符串.

JSON已经被创建为刚才讨论的需求的解决方案:它是一组规则,通过列出所有属性和值来创建等同于对象的字符串(方法被忽略).

JSON规范化了属性名称和值的双引号的使用.

请记住,JSON只是一组规则(标准).

创建了多少个JSON对象?

只有一个,它由JS引擎自动创建.

在浏览器中找到的现代JavaScript引擎具有本机对象,也称为JSON.这个JSON对象能够:

  • 使用JSON.parse(string)解码使用JSON标准构建的字符串.结果是一个常规JS对象,其中包含在JSON字符串中找到的属性和值.

  • 使用JSON.stringify()对常规JS对象的属性/值进行编码.结果是符合JSON规则集的字符串.

(单个)JSON对象类似于编解码器,它的功能是编码和解码.

注意:

  • JSON.parse()不创建JSON对象,它创建常规JS对象,使用对象文字创建的对象与JSON.parse()从符合JSON的字符串创建的对象之间没有区别.

  • 只有一个JSON对象,用于所有转换.

回到问题:

  • Q1:对象文字允许使用单引号.请注意,引号可选地用于属性名称,并且对于字符串值是必需的.对象文字本身没有引号括起来.

  • Q2:从文字创建并使用JSON.parse()的对象完全相同.这两个对象在创建后是等效的:

    var obj1 = { one: 1, "two": 2, "three": 3 };
    var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }');

  • 问题3:现代浏览器JSON.parse()用于从符合JSON的字符串创建JS对象.(jQuery还有一个可用于所有浏览器的等效方法).


Aln*_*tak 7

Q1 - 在JS中,如果密钥是保留字,或者如果它是非法令牌,则只需要使用引号.在JSON中,您必须始终在键名称上使用双引号.

Q2 - jsonString是输入对象的序列化版本......

Q3 - 使用可以反序列化为相同的外观对象JSON.parse()