Javascript object Vs JSON

2022-08-30 00:37:27

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

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

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

问题 1.带引号/不带引号的键/属性名称是否有效?(例如"one" : 1)

如果是,有什么区别?

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

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

问题 3:要解析 JSON 字符串,是否建议使用以下方法?

var javascriptObj = JSON.parse(jSonString);

答案 1
  1. 带引号/不带引号的键/属性名称是否有效?

使用对象文本表示法时,唯一需要将键括在引号中的时间是,键是保留字或包含特殊字符 (, 等)。值得注意的是,JSON中的密钥必须引号括起来。if:-

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

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

这里有一个故事。让我们想象一下,您从商店购买了一些家具,并且您希望将其交付。但是,唯一剩下的库存是展示模型,但您同意购买它。

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

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

但是,您无法在帖子中发送抽屉柜,因此将其拆解(阅读,字符串化)。就家具而言,它现在已经毫无用处了。它现在是 JSON。它采用扁平包装形式。

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

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

JSON,XML和YAML背后的原因是使数据能够以两种参与语言都能理解的格式在编程语言之间传输;你不能直接给你的JavaScript对象C++PHP或;因为每种语言在底层以不同的方式表示一个对象。但是,因为我们已将对象字符串化为 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"}"
  1. 要解析 JSON 字符串,是否建议使用以下方法?var javascriptObj = JSON.parse(jSonString);

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

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


答案 2

问题 1:在 javascript 中定义对象文本时,键可能包含引号,也可能不包含引号。没有区别,除了引号允许您指定某些键,如果您尝试使用它们,这些键将导致解释器无法解析。例如,如果您想要一个只是感叹号的键,则需要引号:

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

但在大多数情况下,您可以省略对象文本上键两边的引号。

问题 2:JSON 实际上是一个字符串表示形式。它只是一个字符串。所以,考虑一下:

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

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

testObject.hello => "world"

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

jsonString.hello => undefined

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

问题 3.您可以使用 解析 JSON 字符串,这通常是执行此操作的最佳方式(如果浏览器或框架提供)。您也可以只使用,因为JSON是有效的javascript代码,但是由于多种原因,建议使用前一种方法(eval有很多令人讨厌的问题)。JSON.parseeval