Javascript对象与JSON

Javascript object Vs JSON

我想清楚地了解JavaScript对象和JSON字符串之间的基本区别。

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

1
var testObject = {one: 1,"two":2,"three":3};

Q1。键/属性名是否同时使用引号/不使用引号?(如"one" : 1)

如果是,有什么区别?

问题2:如果我用JSON.stringify(testObject)转换上面的对象,那么原来的JS对象和JSON有什么区别?

我觉得它们几乎是一样的。请详细说明。

问题3:对于解析JSON字符串,建议使用下面的方法吗?

1
var javascriptObj = JSON.parse(jSonString);


  • Is the key/property name valid both with/without quotes ?

    使用对象文字表示法时,只需在密钥包含特殊字符(if:-等)的地方用引号括起密钥。值得注意的是,JSON中的键必须用双引号括起来。

  • If I convert the above object to JSON using var jSonString = JSON.stringify(testObject);, what is the difference between the 2 (JS obj and JSON)?

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

    这是一个故事。让我们想象一下,你从一家商店买了一些家具,你想把它送出去。然而,唯一剩下的库存是显示模型,但您同意购买它。

    在商店里,你买的抽屉是一个活物:

    1
    2
    3
    4
    var chestOfDrawers = {
        color:"red",
        numberOfDrawers: 4
    }

    但是,你不能把一箱抽屉放在柱子上,所以你把它拆了(读,把它串起来)。它现在在家具方面毫无用处。现在是JSON。它是扁平包装的。

    1
    {"color":"red","numberOfDrawers":4}

    当你收到它,然后你重建抽屉的箱子(阅读,分析它)。它现在回到对象形式。

    JSON/XML和YAML背后的原因是使数据可以在两种参与语言都能理解的格式之间进行编程语言之间的传递;不能直接给PHP或C++的JavaScript对象;因为每个语言在引擎盖下不同地表示一个对象。但是,因为我们已经将对象细化为JSON符号,即一种标准化的表示数据的方式,所以我们可以将对象的JSON表示发送给另一个语言(C++,PHP),它们可以基于对象的JSON表示来重新创建我们自己的对象中的JavaScript对象。

    需要注意的是,JSON不能表示函数或日期。如果试图将对象与函数成员进行字符串化,则该函数将从JSON表示中省略。日期将转换为字符串;

    1
    2
    3
    4
    5
    6
    JSON.stringify({
        foo: new Date(),
        blah: function () {
            alert('hello');
        }
    }); // returns the string"{"foo":"2011-11-28T10:21:33.939Z"}"
  • For parsing a JSON string, is the method below recommended? var javascriptObj = JSON.parse(jSonString);

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

    如果使用jquery,可以调用jQuery.parseJSON(),如果支持,它将在引擎盖下使用JSON.parse(),否则将回退到自定义实现来解析输入。


  • 问题1:在JavaScript中定义对象文本时,键可能包含引号或不包含引号。除了引号允许您指定某些键之外,没有什么区别,如果您试图将它们裸露出来,那么这些键将导致解释器无法解析。例如,如果您想要一个仅为感叹号的键,则需要引号:

    1
    2
    a = {"!": 1234 } // Valid
    a = { !: 1234 } //  Syntax error

    不过,在大多数情况下,可以省略对象文本中键周围的引号。

    问题2:JSON实际上是一种字符串表示。它只是一根绳子。所以,考虑一下:

    1
    2
    var testObject = { hello:"world" }
    var jSonString = JSON.stringify(testObject);

    由于testObject是一个真实的对象,您可以调用它的属性,并对对象执行任何其他操作:

    1
    testObject.hello =>"world"

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

    1
    jsonString.hello => undefined

    注意另一个区别:在JSON中,所有键都必须被引用。这与对象文本不同,根据我在第一季度的解释,引号通常可以省略。

    Q3。您可以使用JSON.parse解析JSON字符串,这通常是最好的方法(如果浏览器或框架提供了它)。您也可以使用eval,因为json是有效的javascript代码,但出于多种原因建议使用前一种方法(eval有很多与之相关的棘手问题)。


    JSON解决的问题

    假设您想在两台计算机之间交换常规的javascript对象,并设置了两个规则:

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

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

    1
    2
    var obj1 = { one: 1,"two":2,"three":3 }; // your example
    var obj2 = { one: obj1.one, two: 2, three: obj1.one + obj1.two };

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

    • 对于第一个对象,您可以发送从文本定义'{ 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对象类似于编解码器,它的功能是编码和解码。

    注意:

    • parse()不创建JSON对象,它创建一个常规的JS对象,使用对象文本创建的对象和json.parse()从JSON兼容的字符串创建的对象没有区别。

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

    回到问题:

    • 问题1:对象文本允许使用单引号或双引号。请注意,引号可选地用于属性名称,对于字符串值是必需的。对象文本本身没有用引号括起来。

    • 问题2:从文本和使用json.parse()创建的对象是完全相同的。这两个对象在创建后是等效的:

      埃多克斯1〔3〕江户十一〔四〕号

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


    在JS中,如果密钥是保留字,或者它是非法标记,则只需要使用引号。在JSON中,必须始终对键名使用双引号。

    q2-jsonString是输入对象的串行版本…

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


    问题已经贴出了很好的答案,我在下面添加了一个小例子,这将使我们更容易理解前面答案中给出的解释。将下面的粘贴片段复制到您的IDE,以便更好地理解和评论包含invalid_javascript_object_no_quotes对象声明的行,以避免编译时错误。

    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
    27
    // Valid JSON strings(Observe quotes)
    valid_json = '{"key":"value"}'
    valid_json_2 = '{"key 1":"value 1"}' // Observe the space(special character) in key - still valid


    //Valid Javascript object
    valid_javascript_object_no_quotes = {
        key:"value"  //No special character in key, hence it is valid without quotes for key
    }


    //Valid Javascript object
    valid_javascript_object_quotes = {
        key:"value",  //No special character in key, hence it is valid without quotes for key
       "key 1":"value 1" // Space (special character) present in key, therefore key must be contained in double quotes  - Valid
    }



    console.log(typeof valid_json) // string
    console.log(typeof valid_javascript_object_no_quotes) // object
    console.log(typeof valid_javascript_object_quotes) // object

    //Invalid Javascript object
    invalid_javascript_object_no_quotes = {
       key 1:"value"//Space (special character) present in key, since key is not enclosed with double quotes"Invalid Javascript Object"
    }