Sự khác biệt giữa ký hiệu JSON và ký hiệu đối tượng là gì?


219

Ai đó có thể cho tôi biết sự khác biệt chính giữa một đối tượng JavaScript được xác định bằng cách sử dụng đối tượng JSONký hiệu đối tượng không?

Theo một cuốn sách JavaScript, nó nói rằng đây là một đối tượng được xác định bằng cách sử dụng Ký hiệu đối tượng :

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

Tại sao nó không phải là một đối tượng JSON trong trường hợp này? Chỉ vì nó không được xác định bằng cách sử dụng dấu ngoặc kép?


20
"Tại sao nó không phải là một đối tượng JSON trong trường hợp này?": Bởi vì các khóa của bạn phải là các chuỗi và một hàm không phải là một giá trị JSON hợp lệ.
Matt

Câu trả lời:


247

Trước tiên hãy làm rõ JSON thực sự là gì. JSON là một văn bản , định dạng dữ liệu trao đổi ngôn ngữ độc lập, giống như XML, CSV hoặc YAML.

Dữ liệu có thể được lưu trữ theo nhiều cách, nhưng nếu nó nên được lưu trữ trong một tệp văn bản và có thể đọc được bằng máy tính, thì nó cần phải tuân theo một số cấu trúc. JSON là một trong nhiều định dạng xác định cấu trúc như vậy.

Các định dạng như vậy thường độc lập với ngôn ngữ, có nghĩa là chúng có thể được xử lý bằng Java, Python, JavaScript, PHP, bạn đặt tên cho nó.

Ngược lại, JavaScript là ngôn ngữ lập trình. Tất nhiên JavaScript cũng cung cấp một cách để xác định / mô tả dữ liệu, nhưng cú pháp rất cụ thể đối với JavaScript.

Như một ví dụ ngược lại, Python có khái niệm về bộ dữ liệu , cú pháp của chúng là (x, y). JavaScript không có cái gì đó như thế này.


Hãy xem xét sự khác biệt về cú pháp giữa các đối tượng JSON và JavaScript.

JSON có các ràng buộc cú pháp sau:

  • Các khóa đối tượng phải là các chuỗi (tức là một chuỗi ký tự được đặt trong dấu ngoặc kép ").
  • Các giá trị có thể là:
    • một chuỗi
    • một số
    • một đối tượng (JSON)
    • một mảng
    • true
    • false
    • null
  • Các khóa trùng lặp ( {"foo":"bar","foo":"baz"}) tạo ra các kết quả không xác định, cụ thể; đặc tả JSON đặc biệt không xác định ngữ nghĩa của chúng

Trong JavaScript, các đối tượng bằng chữ có thể có

  • Chuỗi ký tự, chữ số hoặc tên định danh là khóa (kể từ ES6, giờ đây các khóa cũng có thể được tính toán, giới thiệu một cú pháp khác).
  • Các giá trị có thể là bất kỳ biểu thức JavaScript hợp lệ nào, bao gồm các định nghĩa hàm và undefined.
  • Các khóa trùng lặp tạo ra các kết quả được chỉ định, được chỉ định (ở chế độ lỏng lẻo, định nghĩa sau thay thế trước đó; ở chế độ nghiêm ngặt, đó là lỗi).

Biết rằng, chỉ cần nhìn vào cú pháp , ví dụ của bạn không phải là JSON vì hai lý do:

  1. Khóa của bạn không phải là chuỗi (bằng chữ). Họ là tên định danh .
  2. Bạn không thể gán một hàm làm giá trị cho "đối tượng JSON" (vì JSON không xác định bất kỳ cú pháp nào cho các hàm).

Nhưng quan trọng nhất, để lặp lại lời giải thích của tôi ngay từ đầu: Bạn đang ở trong một bối cảnh JavaScript. Bạn xác định một đối tượng JavaScript. Nếu có, "đối tượng JSON" chỉ có thể được chứa trong một chuỗi:

 var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
 var json = '{"foo": 452}'; // creates a string containing JSON

Đó là, nếu bạn đang viết mã nguồn JavaScript và không xử lý chuỗi , bạn sẽ không xử lý JSON. Có thể bạn đã nhận được dữ liệu dưới dạng JSON (ví dụ: qua ajax hoặc đọc từ tệp), nhưng một khi bạn hoặc thư viện bạn đang sử dụng đã phân tích cú pháp, nó không còn là JSON nữa.


Chỉ vì các đối tượng bằng chữ và JSON trông giống nhau , điều đó không có nghĩa là bạn có thể đặt tên cho chúng thay thế cho nhau. Xem thêm Không có thứ gọi là "Đối tượng JSON" .


8
Cũng lưu ý rằng JSON là một tập hợp con của Ký hiệu đối tượng
Sean Kinsey

14
@SeanKinsey: Ngoại trừ việc nó không phải là: timelessrepo.com/json-isnt-a-javascript-subset
mpen

1
Có thể đáng chú ý rằng thông thường bạn mong đợi một đối tượng JavaScript theo nghĩa đen trong bối cảnh nhận xét là hợp pháp và thông số JSON không cho phép nhận xét (xem bài đăng này .
Brian Henry

Các khóa trong đối tượng bằng chữ luôn là các chuỗi, mặc dù bạn có sử dụng "" hay không.
trao đổi quá

2
@overexchange: "các khóa trong đối tượng theo nghĩa đen luôn là các chuỗi" Bạn đang trộn lẫn hai thứ ở đây, nhưng tôi không thể đổ lỗi cho bạn vì tôi cũng không vẽ một đường rõ ràng ở đây. Bạn phải phân biệt giữa một đối tượng bằng chữ và một giá trị đối tượng . Một nghĩa đen là chuỗi ký tự bạn viết trong mã nguồn. Các giá trị là những gì được tạo ra bằng cách giải thích mã nguồn. Đối tượng bằng chữ (cú pháp) cho phép bạn sử dụng tên định danh , chuỗi ký tự hoặc chữ số . Bạn đúng rằng trong thời gian chạy, tất cả đều được chuyển đổi thành chuỗi (nhưng hiện tại chúng ta cũng có các ký hiệu).
Felix Kling

41

JSON có cú pháp hạn chế hơn nhiều bao gồm:

  • Các giá trị chính phải được trích dẫn
  • Chuỗi phải được trích dẫn với "và không'
  • Bạn có phạm vi giá trị hạn chế hơn (ví dụ: không cho phép chức năng)

1
Thích điều này "không có chức năng được phép".
Karan Kaw

Bình luận cũng không được phép. Vì lý do nghi vấn. (Nghe họ hỏi vài lần.) Đây là điểm khác biệt chính tôi muốn nói
user7610

15

Thực sự không có thứ gọi là "Đối tượng JSON".

Thông số JSON là một cú pháp để mã hóa dữ liệu dưới dạng chuỗi. Cái mà mọi người gọi là "Đối tượng JSON" (trong javascript) thực sự chỉ là một đối tượng javascript thông thường (có thể) đã được tuần tự hóa từ một chuỗi JSON hợp lệ và có thể dễ dàng tái tuần tự thành một chuỗi JSON hợp lệ. Điều này thường có nghĩa là nó chỉ chứa dữ liệu (và không có chức năng). Điều đó cũng có nghĩa là không có ngày, vì JSON không có loại ngày (có lẽ là điều đau đớn nhất về JSON;)

Hơn nữa, (side-rant ...) khi mọi người nói về "Đối tượng JSON", họ hầu như luôn có nghĩa là dữ liệu có "dấu ngoặc nhọn" ở cấp cao nhất. Điều này tương ứng độc đáo với một đối tượng javascript. Tuy nhiên, thông số JSON không yêu cầu phải có một đối tượng "dấu ngoặc nhọn" ở cấp cao nhất của chuỗi JSON. JSON là hoàn toàn hợp lệ để có một danh sách ở cấp cao nhất hoặc thậm chí chỉ có một giá trị duy nhất. Vì vậy, trong khi mọi "Đối tượng JSON" tương ứng với JSON hợp lệ, không phải tất cả các chuỗi JSON hợp lệ đều tương ứng với cái mà chúng ta sẽ gọi là "Đối tượng JSON"! (vì chuỗi có thể đại diện cho một danh sách hoặc một giá trị nguyên tử)


5
Có một lỗi trong câu trả lời của bạn: JSON không hợp lệ khi có giá trị nguyên tử ở cấp cao nhất. JSON cho phép đỉnh là một đối tượng hoặc một mảng, nhưng không có gì khác. RFC4627 , tiêu chuẩn, mô tả ngữ pháp của JSON là JSON-text = object / array.
Rory O'Kane

9

Theo JSON trong JavaScript ,

JSON là một tập hợp con của ký hiệu nghĩa đen của JavaScript.

Nói cách khác, JSON hợp lệ cũng là ký hiệu đối tượng JavaScript hợp lệ nhưng không nhất thiết phải theo cách khác.

Ngoài việc đọc tài liệu , như @Filix King đề xuất, tôi cũng đề nghị chơi xung quanh với trình xác nhận JSON trực tuyến JSONLint . Đó là cách tôi học được rằng các khóa của các đối tượng JSON phải là các chuỗi.


2
Chỉ cần lưu ý: Đây không phải là một tập hợp con chính xác , có một số chuỗi JSON không hợp lệ dưới dạng chữ đối tượng JS
Bergi

5

🔫 JSON : The Fat-Free Alternative to XML

JSON đã được chấp nhận rộng rãi bởi những người nhận thấy rằng nó giúp việc sản xuất các ứng dụng và dịch vụ phân tán trở nên dễ dàng hơn rất nhiều. Loại phương tiện truyền thông Internet chính thức cho JSON là application/json RFC 4627. Tên tệp JSON sử dụng phần mở rộng .json.


► Ký hiệu đối tượng JavaScript ( JSON) là định dạng trao đổi dữ liệu độc lập, dựa trên văn bản, nhẹ. JSON đã được sử dụng để trao đổi dữ liệu giữa các ứng dụng được viết bằng bất kỳ ngôn ngữ lập trình nào.

Đối tượng JSON là một đối tượng duy nhất chứa hai hàm, phân tích cú pháp và xâu chuỗi, được sử dụng để phân tích và xây dựng các văn bản JSON.

  • JSON.opesify tạo ra một Chuỗi phù hợp với ngữ pháp JSON sau đây.
  • JSON.parse chấp nhận Chuỗi phù hợp với ngữ pháp JSON.

Phương pháp parseJSON sẽ được bao gồm trong Fourth Edition of ECMAScript. Trong khi đó, việc triển khai JavaScript có sẵn tại json.org.

var objLiteral = {foo: 42}; // JavaScript Object
console.log('Object Literal : ', objLiteral ); // Object {foo: 42}foo: 42__proto__: Object

// This is a JSON String, like what you'd get back from an AJAX request.
var jsonString = '{"foo": 452}';
console.log('JOSN String : ', jsonString ); // {"foo": 452}

// This is how you deserialize that JSON String into an Object.
var serverResposnceObject = JSON.parse( jsonString );
console.log('Converting Ajax response to JavaScript Object : ', serverResposnceObject); // Object {foo: 42}foo: 42 __proto__: Object

// And this is how you serialize an Object into a JSON String.
var serverRequestJSON = JSON.stringify( objLiteral );
console.log('Reqesting server with JSON Data : ', serverRequestJSON); // '{"foo": 452}'

JSON là tập hợp con của JavaScript. Javascript được lấy từ Tiêu chuẩn Ngôn ngữ Lập trình ECMAScript.


► Bản thảo

ECMAScript đã phát triển thành một trong những ngôn ngữ lập trình mục đích chung được sử dụng rộng rãi nhất trên thế giới. Nó được biết đến như là ngôn ngữ được nhúng trong trình duyệt web nhưng cũng đã được áp dụng rộng rãi cho máy chủ và các ứng dụng nhúng. ECMAScript dựa trên một số công nghệ có nguồn gốc, nổi tiếng nhất là JavaScript(Netscape Communications)) và JScript(Tập đoàn Microsoft).) . Mặc dù trước năm 1994, ECMA được gọi là "Hiệp hội các nhà sản xuất máy tính châu Âu", sau năm 1994, khi tổ chức này trở nên toàn cầu, "nhãn hiệu" "Ecma" đã được giữ vì lý do lịch sử.

ECMAScript là ngôn ngữ, trong khi JavaScript, JScript và thậm chí ActionScript được gọi "Dialects".

Các phương ngữ đã được bắt nguồn từ cùng một ngôn ngữ. Chúng khá giống nhau vì chúng có nguồn gốc từ cùng một ngôn ngữ nhưng chúng đã trải qua một số thay đổi. Một phương ngữ là một biến thể trong chính ngôn ngữ. Nó có nguồn gốc từ một ngôn ngữ duy nhất.

  • Ngôn ngữ SQL - Phương ngữ MySQL ngủ đông, Phương ngữ Oracle, .. có một số thay đổi hoặc thêm chức năng.

Thông tin về trình duyệt và máy tính của người dùng của bạn.

navigator.appName // "Netscape"

ECMAScript là ngôn ngữ kịch bản tạo thành nền tảng của JavaScript. .JavaScript language resources

ECMA-262 Links
Initial Edition, June 1997 PDF.
2nd Edition, August 1998 PDF.
3rd Edition, December 1999 PDF.
5th Edition, December 2009 PDF.
5.1 Edition, June 2011 HTML.
6th Edition, June 2015 HTML.
7ᵗʰ Edition, June 2016 HTML.
8th edition, June 2017 HTML.
9th Edition, 2018 HTML.

LƯU Ý « Phiên bản thứ 4 của ECMAScript không được xuất bản vì công việc chưa hoàn thành .


JSON định nghĩa một tập hợp nhỏ các quy tắc định dạng cho biểu diễn di động của dữ liệu có cấu trúc.

  1. ► Các giá trị khóa phải được trích dẫn, chỉ các chuỗi được phép cho các khóa. Nếu bạn sử dụng khác với String, nó sẽ chuyển đổi thành String. Nhưng không nên sử dụng các khóa khác ngoài String. Kiểm tra một ví dụ như thế này - { 'key':'val' }hơnRFC 4627 - jsonformatter

    var storage = {
      0 : null,
      1 : "Hello"
    };
    console.log( storage[1] ); // Hello
    console.log( JSON.stringify( storage ) ); // {"0":null,"1":"Hello","2":"world!"}
    
    var objLiteral = {'key1':'val1'};
        var arr = [10, 20], arr2 = [ 'Yash', 'Sam' ];
        var obj = { k: 'v' }, obj2 = { k2: 'v2' };
        var fun = function keyFun() {} ;
    
    objLiteral[ arr ] = 'ArrayVal';     objLiteral[ arr2 ] = 'OverridenArrayVal';
    objLiteral[ obj ] = 'ObjectVal';    objLiteral[ obj2 ] = 'OverridenObjectVal';
    objLiteral[ fun ] = 'FunctionVal';
    
    console.log( objLiteral );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    console.log( JSON.stringify( objLiteral ) );
    // {"key1":"val1","10,20":"ArrayVal","Yash,Sam":"OverridenArrayVal","[object Object]":"OverridenObjectVal","function keyFun() {}":"FunctionVal"}
    console.log( JSON.parse( JSON.stringify( objLiteral ) ) );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    
    console.log('Accessing Array  Val : ', objLiteral[ [10,20] ] );
    console.log('Accessing Object Val : ', objLiteral[ '[object Object]' ] );
    console.log('Accessing Function Val : ', objLiteral[ 'function keyFun() {}' ] );
  2. ► Các chuỗi JSON phải được trích dẫn bằng "và không". Một chuỗi rất giống với chuỗi C hoặc Java. Các chuỗi phải được gói trong dấu ngoặc kép.

    • Chữ là giá trị cố định, không phải là biến, mà bạn thực sự cung cấp trong tập lệnh của mình.
    • Chuỗi là một chuỗi gồm 0 hoặc nhiều ký tự được gói trong dấu ngoặc kép với dấu gạch chéo ngược, ký hiệu tương tự được sử dụng trong hầu hết các ngôn ngữ lập trình.
      • - Biểu tượng đặc biệt được phép trong Chuỗi nhưng không được khuyến nghị sử dụng.
      • \ "- Các ký tự đặc biệt có thể được thoát. Nhưng không được đề xuất để thoát (') Dấu ngoặc đơn. Ở chế độ Nghiêm, nó sẽ ném và Lỗi - SyntaxError: Unexpected token ' in JSON

    Kiểm tra mã này { "Hai\" \n Team 🔫":5, "Bye \'": 7 }qua các Chỉnh sửa JSON trực tuyến.ModesnotStrict,Strinct.

    var jsonString = "{'foo': 452}"; // {'foo': 452}
    var jsonStr = '{"foo": 452}'; // {"foo": 452}
    
    JSON.parse( jsonString ); // Unexpected token ' in JSON at position 1(…)
    JSON.parse( jsonStr ); // Object {foo: 452}
    
    objLiteral['key'] = 'val'; // Object {foo: 42, key: "val"}
    objLiteral.key2 = 'val';
    
    // objLiteral.key\n3 - SyntaxError: Invalid or unexpected token
    objLiteral['key\n3'] = 'val'; // Object {"foo": "42", key: "val", key2: "val", "key↵3": "val"}
    
    JSON.stringify( objLiteral ); // {"foo":"42","key":"val","key2":"val","key\n3":"val"}

Object accessors tài sản cung cấp quyền truy cập vào các thuộc tính của một đối tượng bằng cách sử dụng các ký hiệu dấu chấm hoặc ký hiệu khung.

  1. ► Bạn có phạm vi giá trị hạn chế hơn (ví dụ: không cho phép chức năng). Một giá trị có thể là một chuỗi trong dấu ngoặc kép, số, boolean, null, đối tượng hoặc mảng. Các cấu trúc này có thể được lồng nhau.

    var objLiteral = {};
    objLiteral.funKey = function sayHello() {
        console.log('Object Key with function as value - Its outcome message.');
    };
    
    objLiteral['Key'] = 'Val';
    
    console.log('Object Literal Fun : ', objLiteral );
    // Object Literal Fun :  Object {Key: "Val"}Key: "Val"funKey: sayHello()__proto__: Object
    console.log( JSON.stringify( objLiteral ) ); // {"Key":"Val"}

nhập mô tả hình ảnh ở đây


JavaScriptlà triển khai phổ biến nhất của Tiêu chuẩn ECMAScript. Các tính năng cốt lõi của Javascript dựa trên tiêu chuẩn ECMAScript, nhưng Javascript cũng có các tính năng bổ sung khác không có trong thông số / tiêu chuẩn ECMA. Mỗi trình duyệt có một trình thông dịch JavaScript.

JavaScript là một ngôn ngữ được gõ động. Điều đó có nghĩa là bạn không phải chỉ định loại dữ liệu của một biến khi bạn khai báo nó và các loại dữ liệu được chuyển đổi tự động khi cần trong quá trình thực thi tập lệnh.

Literals :

'37' - 7    // 30
'37' + 7    // "377"
+'37' + 7   // 44
+'37'       // 37
'37'        // "37"

parseInt('37');     // 37
parseInt('3.7');    // 3

parseFloat(3.7);    // 3.7

// An alternative method of retrieving a number from a string is with the + (unary plus) operator:
+'3.7'              // 3.7

Object literals RFC 7159

Một cấu trúc đối tượng được biểu diễn dưới dạng một cặp dấu ngoặc nhọn bao quanh 0 hoặc nhiều cặp tên / giá trị (hoặc thành viên). Một tên là một chuỗi. Một dấu hai chấm xuất hiện sau mỗi tên, tách tên khỏi giá trị. Dấu phẩy đơn tách một giá trị từ một tên sau. Tên trong một đối tượng NÊN là duy nhất.

ECMAScript hỗ trợ kế thừa dựa trên nguyên mẫu. Mỗi hàm tạo có một nguyên mẫu liên quan và mọi đối tượng được tạo bởi hàm tạo đó có một tham chiếu ngầm đến nguyên mẫu (được gọi là nguyên mẫu của đối tượng) được liên kết với hàm tạo của nó. Hơn nữa, một nguyên mẫu có thể có một tham chiếu ngầm không null đến nguyên mẫu của nó, v.v. đây được gọi là chuỗi nguyên mẫu.

Trong một ngôn ngữ hướng đối tượng dựa trên lớp, nói chung, trạng thái được thực hiện bởi các thể hiện, các phương thức được thực hiện bởi các lớp và kế thừa chỉ là cấu trúc và hành vi. Trong ECMAScript, trạng thái và phương thức được thực hiện bởi các đối tượng và cấu trúc, hành vi và trạng thái đều được kế thừa.

Nguyên mẫu là một đối tượng được sử dụng để thực hiện kế thừa cấu trúc, trạng thái và hành vi trong ECMAScript. Khi một hàm tạo tạo một đối tượng, đối tượng đó sẽ tham chiếu ngầm định nguyên mẫu liên kết của hàm tạo với mục đích giải quyết các tham chiếu thuộc tính. Nguyên mẫu liên quan của hàm tạo có thể được tham chiếu bởi biểu thức constructor.prototype của chương trình và các thuộc tính được thêm vào nguyên mẫu của đối tượng được chia sẻ, thông qua kế thừa, bởi tất cả các đối tượng chia sẻ nguyên mẫu.


2

Đối với những người vẫn nghĩ rằng RFC quan trọng hơn blog và những quan niệm sai lầm dựa trên quan điểm, hãy thử trả lời làm rõ một số điểm. Tôi sẽ không lặp lại tất cả các khác biệt chính xác đã được đề cập trong các câu trả lời trước đây, ở đây tôi chỉ đang cố gắng thêm giá trị tóm tắt một số phần quan trọng rfc7159

Trích xuất từ https://tools.ietf.org/html/rfc7159

  1. Ký hiệu đối tượng JavaScript (JSON) là định dạng văn bản để tuần tự hóa dữ liệu có cấu trúc. Nó được lấy từ các đối tượng bằng chữ JavaScript, như được định nghĩa trong Tiêu chuẩn ngôn ngữ lập trình ECMAScript, Ấn bản thứ ba [ECMA-262].
  2. JSON có thể đại diện cho bốn loại nguyên thủy (chuỗi, số, booleans và null) và hai loại có cấu trúc ( đối tượng và mảng).
  3. Một đối tượng là một tập hợp không có thứ tự gồm các cặp tên / giá trị 0 hoặc nhiều hơn, trong đó tên là một chuỗi và giá trị là một chuỗi, số, boolean, null, đối tượng hoặc mảng.
  4. start -object = ws% x7B ws; {dấu ngoặc trái
  5. đối tượng cuối = ws% x7D ws; } khung cong phải
  6. Giá trị JSON PHẢI là một đối tượng , mảng, số hoặc chuỗi hoặc một trong ba tên bằng chữ sau: false null true
  7. Một cấu trúc đối tượng được biểu diễn dưới dạng một cặp dấu ngoặc nhọn
  8. Tên trong một đối tượng NÊN là duy nhất. object = started-object [thành viên * (thành viên phân tách giá trị)] end-object
  9. Một đối tượng có tên là duy nhất có thể tương tác theo nghĩa là tất cả các cài đặt phần mềm nhận được đối tượng đó sẽ đồng ý về ánh xạ giá trị tên. Khi tên trong một đối tượng không phải là duy nhất, hành vi của phần mềm nhận được một đối tượng như vậy là không thể đoán trước.
  10. Ví dụ (từ trang 12 của RFC)

    Đây là một đối tượng JSON:

          {
            "Image": {
                "Width":  800,
                "Height": 600,
                "Title":  "View from 15th Floor",
                "Thumbnail": {
                    "Url":    "http://www.example.com/image/481989943",
                    "Height": 125,
                    "Width":  100
                },
                "Animated" : false,
                "IDs": [116, 943, 234, 38793]
              }
          }

    Thành viên Image của nó là một đối tượng có thành viên Thumbnail là một đối tượng và thành viên ID của nó là một mảng các số.

Thực sự không có thứ gọi là "Đối tượng JSON".

Có thật không?


1
Davi, nó không phải là một Object, nó là một String. Cảm ơn
abu abu

1

Theo tôi hiểu sự khác biệt chính là sự linh hoạt .

JSON là một loại trình bao bọc trên "Ký hiệu đối tượng JavaScript", buộc người dùng phải tuân theo các quy tắc nghiêm ngặt hơn để xác định các đối tượng. Và nó thực hiện điều này bằng cách giới hạn các cách khai báo đối tượng có thể được cung cấp bởi tính năng Ký hiệu đối tượng JavaScript.

Kết quả là chúng ta có một đối tượng đơn giản hơn và được tiêu chuẩn hóa hơn, phù hợp hơn với việc trao đổi dữ liệu giữa các nền tảng.

Về cơ bản, newObject trong ví dụ của tôi ở trên là một đối tượng được xác định bằng cách sử dụng Ký hiệu Objeect JavaScript; nhưng nó không phải là một đối tượng JSON 'hợp lệ' vì nó không tuân theo các quy tắc mà các tiêu chuẩn JSON yêu cầu.

Liên kết này cũng khá hữu ích: http://msdn.microsoft.com/en-us/l Library / bb299886.aspx


2
Mục đích của JSON và ký hiệu đối tượng là hoàn toàn khác nhau: lần đầu tiên chỉ được sử dụng để trao đổi dữ liệu và lần thứ hai là để tạo các đối tượng JS chỉ để sử dụng nội bộ. Chúng không phải là phiên bản nhiều hơn và ít nghiêm ngặt hơn của cùng một điều.
ilyo

0

Trước tiên, bạn nên biết JSON là gì:

Đây là định dạng trao đổi dữ liệu bất khả tri ngôn ngữ. Cú pháp của JSON được lấy cảm hứng từ ký hiệu đối tượng JavaScript, nhưng có sự khác biệt giữa chúng.

Ví dụ, trong JSON, tất cả các khóa phải được trích dẫn, trong khi ở dạng đối tượng, điều này là không cần thiết:

// JSON: {"foo": "bar"}

// Đối tượng bằng chữ: var o = {foo: "bar"}; Các trích dẫn là bắt buộc trên JSON vì trong JavaScript (chính xác hơn là trong ECMAScript 3. Edition), việc sử dụng các từ dành riêng làm tên thuộc tính không được phép, ví dụ:

var o = {if: "foo"}; // Cú phápError trong ES3 Trong khi, sử dụng chuỗi ký tự bằng chữ làm tên thuộc tính (trích dẫn tên thuộc tính) sẽ không gặp vấn đề gì:

var o = {"nếu": "foo"}; Vì vậy, để "tương thích" (và có thể dễ dàng đánh giá?), Các trích dẫn là bắt buộc.

Các kiểu dữ liệu trong JSON cũng bị giới hạn ở các giá trị sau:

mảng đối tượng số chuỗi Một nghĩa đen là: true false null Ngữ pháp của chuỗi thay đổi. Chúng phải được phân cách bằng dấu ngoặc kép, trong khi trong JavaScript, bạn có thể sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép thay thế cho nhau.

// JSON không hợp lệ: {"foo": 'bar'} Ngữ pháp số được chấp nhận của JSON cũng thay đổi, trong JavaScript, bạn có thể sử dụng Văn bản thập lục phân, ví dụ 0xFF hoặc (chữ nổi tiếng) Octal Literals, ví dụ 010. Trong JSON bạn có thể sử dụng chỉ có chữ thập phân.

// JSON không hợp lệ: {"foo": 0xFF}


0

Đối tượng Javascript theo nghĩa đen so với JSON:

  • Cú pháp đối tượng là một cách rất thuận tiện để tạo các đối tượng javascript
  • Các JSONngôn ngữ, viết tắt của 'chú thích đối tượng javascript', có cú pháp của nó bắt nguồn từ cú pháp literal đối tượng javascript. Nó được sử dụng như một ngôn ngữ lập trình định dạng truyền dữ liệu văn bản độc lập.

Thí dụ:

Ký hiệu đối tượng JS, được sử dụng trong JS để tạo các đối tượng trong mã một cách thuận tiện:

const JS_Object = {
  1: 2,  // the key here is the number 1, the value is the number 2
  a: 'b', // the key is the string a, the value is the string b
  func: function () { console.log('hi') }
  // the key is func, the value is the function
}

Ví dụ về JSON:

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}

Sự khác biệt chính:

  • Tất cả các khóa đối tượng trong JSON phải là chuỗi. Trong các khóa đối tượng Javascript có thể là chuỗi hoặc số

  • Tất cả các chuỗi trong JSON phải được trích dẫn trong "dấu ngoặc kép". Trong khi đó trong Javascript cả hai dấu ngoặc đơn và dấu ngoặc kép đều được phép. Ngay cả khi không có dấu ngoặc kép trong ký hiệu đối tượng Javascript, các khóa đối tượng được đặt ngầm thành chuỗi.

  • Trong JSON, một hàm không thể được định nghĩa là giá trị của một đối tượng (vì đây là đặc trưng của Javascript). Trong Javascript điều này là hoàn toàn hợp pháp.

Xây dựng Javascript trong JSONđối tượng:

JSONcác đối tượng có thể dễ dàng chuyển đổi thành Javascript và ngược lại bằng cách sử dụng JSONđối tượng tích hợp mà Javascript cung cấp trong thời gian chạy. Ví dụ:

const Object = {
  property1: true,
  property2: false,
}; // creating object with JS object literal syntax

const JSON_object = JSON.stringify(Object);  // stringify JS object to a JSON string

console.log(JSON_object); // note that the (string) keys are in double quotes

const JS_object = JSON.parse(JSON_object);  // parse JSON string to JS object

console.log(JS_object.property1, JS_object.property2); 
// accessing keys of the newly created object


0

Đây là một điểm khác biệt đáng ngạc nhiên: bạn không thể sử dụng undefinedtrong json và tất cả các trường đối tượng có giá trị không xác định sẽ biến mất sauJSON.stringify

let object =  { "a": undefined } ;

let badJSON= '{ "a": undefined }';


console.log('valid JS object :', object );
console.log('JSON from object:', JSON.stringify(object) );
console.log('invalid json    :', JSON.parse(badJSON) );

🙈🙉🙊

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.