【问题标题】:Javascript object Vs JSONJavascript 对象与 JSON
【发布时间】:2012-01-07 19:24:17
【问题描述】:

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

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

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

第一季度。带/不带引号的键/属性名称是否有效?(例如"one" : 1

如果是,有什么区别?

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

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

Q3:解析JSON字符串,推荐以下方法吗?

var javascriptObj = JSON.parse(jSonString);

【问题讨论】:

    标签: javascript json


    【解决方案1】:
    1. 键/属性名称在带/不带引号的情况下都有效吗?

    在使用 Object Literal 表示法时,唯一需要将键括在引号中的情况是键包含特殊字符(if:- 等)。值得注意的是,JSON 中的键必须引号括起来。

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

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

    这是一个故事。假设您从商店购买了一些家具,并且希望将其交付。但是库存中只剩下展示模型,但您同意购买。

    在商店里,您购买的抽屉柜是活物:

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

    但是,您不能在邮件中发送抽屉柜,因此您将其拆除(阅读,将其串起来)。它现在在家具方面毫无用处。现在是 JSON。它采用扁平包装形式。

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

    当您收到它时,您会重新构建抽屉柜(读取、解析它)。它现在又回到了对象形式。

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

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

        JSON.stringify({
            foo: new Date(),
            blah: function () { 
                alert('hello');
            }
        }); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
    
    1. 解析 JSON 字符串,是否推荐以下方法? var javascriptObj = JSON.parse(jSonString);

    是的,但是older browsers don't support JSON natively (IE <8)。要支持这些,您应该添加json2.js

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

    【讨论】:

    • @testndtv 你没抓住重点——尽管在纸上(或屏幕上)JSON 字符串和 JS 对象的 display 可能看起来 一样,它们不是一回事。 JSON 只是一种将对象打包成字符串的方法,因此可以将其传输到某个地方,然后再将其解包回对象。
    • @Matt 拙劣的类比恕我直言 - JSON 不应该用于序列化具有方法的对象 - 仅适用于纯数据对象。
    • @Growler:如果“事物”需要在服务器上生成,我通常使用 JSON,如果“事物”只是 ,则使用 js 文件按原样提供。另一个很大的区别是您是否需要包含函数和/或日期,因为 JSON 无法表示它们,因此您必须求助于提供 JS 文件。如果您仍然不确定,请随时在 Stack Overflow 上将其作为单独的问题提出(显示您需要提供的内容示例以表示您的对话),并通过链接提示我;我很乐意仔细看看!
    • @Matt 你先生,真是个天才!您的解释准确、清晰、简洁且易于理解。我希望你是我的 JavaScript/编程导师。
    • @Matt 非常喜欢家具类比。希望看到更多这样的东西,更容易理解,马上抓住,不会忘记。
    【解决方案2】:

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

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

    不过,在大多数情况下,您可以省略对象字面量键周围的引号。

    Q2:JSON 从字面上看是一种字符串表示。它只是一个字符串。所以,考虑一下:

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

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

    testObject.hello => "world"
    

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

    jsonString.hello => undefined
    

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

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

    【讨论】:

      【解决方案3】:

      JSON 解决的问题

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

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

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

      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 对象类似于编解码器,它的功能是编码和解码。

      注意:

      • 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" }');

      • Q3:在现代浏览器上,JSON.parse() 用于从符合 JSON 的字符串创建 JS 对象。 (jQuery还有一个等价的方法,可以用于所有浏览器)。

      【讨论】:

      • 在我看来,在 Q2 中,对象 obj1 和 obj2 实际上是不同的,因为 JSON 字符串包含字符串值“1”、“2”和“3”,而文字定义包含整数 1 , 2 和 3。
      • @tebb:正确。我不应该对 obj2 中的数字使用字符串。要解析的字符串包含整数,那么js对象也包含整数(并且两个对象都相等)
      【解决方案4】:

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

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

      Q3 - 可以使用JSON.parse()

      反序列化为外观相同的对象

      【讨论】:

        【解决方案5】:

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

        // 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"
        }
        

        【讨论】:

          猜你喜欢
          • 2014-01-15
          • 1970-01-01
          • 2016-09-02
          • 2011-12-02
          • 2012-03-22
          • 2014-01-10
          • 1970-01-01
          • 1970-01-01
          • 2016-03-16
          相关资源
          最近更新 更多