JavaScript对象和JSON对象有什么区别?

37

有没有人能举一个例子告诉我JavaScript对象和JSON对象之间的区别?

5个回答

56

JavaScript中的对象是JavaScript中的一种数据类型-它只在JavaScript中才有意义。通常你会看到像这样的JavaScript对象字面量

var obj = {
    a: 1,
    b: 2
};

JSON字符串是一种数据交换格式,它只是以特定的方式格式化一堆字符(为了不同程序之间进行通信)。因此,它可以存在于Javascript中,也可以存在于另一种语言中,或者仅仅存储在数据库或文本文件中。

上述Javascript对象可以在Javascript中以JSON格式表示,如下所示:

var json = '{ "a": 1, "b": 2 }';

或者在C#中这样写:

string json = "{ \"a\": 1, \"b\": 2 }";

正如你所看到的,JSON只是被存储在一个字符串中。为了让它有用,可以将JSON字符串进行解析,生成任何语言中的对象。由于JSON格式模仿了Javascript的对象字面量语法,因此Javascript使解析过程变得容易:

var obj = eval('(' + json + ')');

虽然通常你会看到:

var obj = JSON.parse(json); // for security reasons
请注意,JSON有一个局限性,它不能存储函数 - 它只能包含以下值:
- 对象(字面量) - 数组 - 数字 - 布尔值 - 字符串 - 空值

4
JSON和JavaScript对象的关键区别在于,"JSON字符串是一种数据交换格式",而JavaScript对象是JavaScript中的一种数据类型。 - neelmeg

15

JSON是JavaScript对象的文本表示。它实际上是JavaScript符号字面量(因此名为JavaScript对象表示法=> JSON)。

如果您想“比较”两个对象,请将文本转换为对象,然后比较键和值。

一些对象到/从文本的示例:

// Create obj using an object literal
var obj = {key: 'value'};

// Convert to text using JSON.stringify
var text = JSON.stringify(obj);

// Show the value of text
alert( text ); // {"key":"value"}

// Create a new object from text
var newObj = JSON.parse(text); // javascript object

// Show the text version of newObj
alert(JSON.stringify(newObj));  // {"key":"value"}

// Use text as code
var newObj2 = eval('(' + text + ')');

// It is indeed a string literal
alert(JSON.stringify(newObj2));  // {"key":"value"}

如果您想比较两个对象,请将它们从JSON转换为对象(如果它们最初是JSON),然后执行以下操作:

function compareObjects(a, b) {
  var i, p, aProps = [], bProps = [];

  // Simple test first
  if (a === b) {
    return true;
  }

  // Get properties of a
  for (p in a) {
    if (a.hasOwnProperty(p)) {
      aProps.push(p);
    } 
  }

  // Get properties of b
  for (p in b ) {
    if (b.hasOwnProperty(p)) {
      bProps.push(p);
    } 
  }

  // If don't have same properties, return false
  if (aProps.sort().join('') != bProps.sort().join('')) {
    return false;
  }

  // If property values aren't the same, return false
  i = aProps.length;
  while (i--) {
    if (a[aProps[i]] !== b[bProps[i]]) {
      return false;
    }
  }

  // If passed all tests, must be equal
  return true;
}

是的,我已经读了那个...但我在任何地方都没有找到声明示例,我想比较它们并看看有什么不同? - Refti
2
修改你的问题来包括这个。 - RobG
1
请注意:"var obj =" 不是 JSON 的一部分!严格来说,JSON 只是数据,尽管它往往被执行,好像它是用来加载内存中的对象的代码。你只需要 {} 和其中的内容作为 JSON 数据,然后你可以在 JavaScript 代码或其他编程语言中“评估”并赋值给一个变量。添加 "var" 将 JSON 转换为 Javascript... - Wim ten Brink
@Wim - 是的,说得好。我使用JavaScript对象字面量作为一种简单的方法来获取格式正确的JSON字符串。 - RobG

3

JSON代表“JavaScript对象表示法”。基本上,JSON是JavaScript,但仅限于将对象填充数据。通过执行JSON对象,您可以将数据“加载”到内存中。
JavaScript是更大的图像,具有额外的代码行来操作对象或执行各种其他操作。

JSON示例如下:

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

一个 JavaScript 示例如下所示:
var Glossary = {
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

请注意JavaScript中的var Glossary =

0
首先,JavaScript 就像面向对象编程中的任何其他对象一样。
正如 RobG 所说,JSON 实际上是 JavaScript 符号表示法中的对象字面量。但并不完全相同。 根据一本 JavaScript 书籍的说法,这是使用对象符号定义的对象:
var newObject = 
{     prop1 : true,     
showMessage : function (msg) {alert(msg)} 
}; 

根据 JavaScript 中的 JSON,
JSON 是 JavaScript 对象字面量符号的子集。
此外,您可能想要考虑查看此 link

0
var object = {
    name: "John",
    profession: "blogger"
};

alert(object.name);//John
alert(typeof(object));//Object
alert(object);//[object Object]


var json = JSON.stringify(object);

alert(json.name);//undefined
alert(typeof(json));//string
alert(json);//{"name":"John","profession":"blogger"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接