首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript对象与JSON

Javascript对象与JSON
EN

Stack Overflow用户
提问于 2011-11-28 17:53:34
回答 5查看 104.8K关注 0票数 237

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

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

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

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

若有,分别在哪里?

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

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

Q3:解析JSON字符串,推荐使用下面的方法吗?

var javascriptObj = JSON.parse(jSonString);
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-28 17:57:11

  1. 是键/属性名称,带/不带引号都有效?

在使用对象文字表示法时,唯一需要将键括在引号中的情况是键包含特殊字符(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
    }

然而,你不能在邮件中发送一个抽屉柜,所以你要拆掉它(read,stringify it)。现在它在家具方面已经没有用处了。它现在是JSON。它是扁平包装的。

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

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

XML和YAML背后的原因是使数据能够以两种参与语言都能理解的格式在编程语言之间传输;您不能直接将JavaScript对象交给PHP或C++;因为每种语言本质上表示对象的方式都不同。但是,因为我们已经将对象字符串化为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);

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

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

票数 269
EN

Stack Overflow用户

发布于 2011-11-28 18:03:26

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中的解释,引号通常可以省略。

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

票数 31
EN

Stack Overflow用户

发布于 2015-06-01 08:24:58

用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

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

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

请注意:

  • JSON.parse()不会创建JSON对象,它会创建一个常规的JS对象,使用对象文字创建的对象和从符合JSON的string.
  • There中使用JSON.parse()创建的对象之间没有区别只有一个JSON对象,该对象用于所有conversions.

返回到questions

  • 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也有一个可用于所有浏览器的等效方法)。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8294088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档