2010-10-20 30 views
89

Tôi mới sử dụng đối tượng JSON và JavaScript.Sự khác nhau giữa JSON và đối tượng JavaScript là gì?

  • Ai đó có thể giải thích sự khác biệt giữa đối tượng JSON và JavaScript không?
  • Cách sử dụng của chúng là gì?
  • Có tốt hơn loại kia không? Hay nó phụ thuộc vào tình hình?
  • Khi nào sử dụng cái nào, trong tình huống nào?
  • Tại sao JSON được tạo ở vị trí đầu tiên? Mục đích chính của nó là gì?
  • Ai đó có thể đưa ra ví dụ về thời điểm một người nên sử dụng JSON thay vì đối tượng JavaScript và ngược lại?
+0

Một câu hỏi tại một thời điểm, vui lòng. –

+0

bản sao có thể có của [Sự khác nhau giữa JSON và Ký hiệu chữ của đối tượng là gì?] (Http://stackoverflow.com/questions/2904131/what-is-the-difference-between-json-and-object-literal-notation) – Teepeemm

Trả lời

131

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

  • Đó là ngôn ngữ thuyết bất khả tri định dạng dữ liệu trao đổi.

Cú pháp của JSON được lấy cảm hứng từ ký hiệu 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ả phím phải được trích dẫn, trong khi ở literals đối tượng này là không cần thiết:

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

// Object literal: 
var o = { foo: "bar" }; 

Các dấu ngoặc kép là bắt buộc trên JSON vì trong JavaScript (chính xác hơn trong ECMAScript 3rd Edition.), việc sử dụng từ dành riêng như tên thuộc tính là không được phép, ví dụ:

var o = { if: "foo" }; // SyntaxError in ES3 

trong khi, sử dụng một chuỗi chữ như một tên thuộc tính (trích dẫn các pro Tên perty) không đưa ra vấn đề:

var o = { "if": "foo" }; 

Vì vậy, đối "tương thích" (và dễ dàng eval'ing có thể) có dấu ngoặc kép là bắt buộc?.

Các loại dữ liệu trong JSON cũng bị hạn chế để các giá trị sau:

  • string
  • number
  • object
  • array
  • Một literal như:
    • true
    • false
    • null

Ngữ pháp của Strings thay đổi. Họ phải được phân tách bằng dấu ngoặc kép, trong khi bằng JavaScript, bạn có thể sử dụng dấu ngoặc kép đơn hoặc kép thay thế cho nhau.

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

Các JSON ngữ pháp được chấp nhận của Numbers cũng thay đổi, trong JavaScript bạn có thể sử dụng Hexadecimal Literals, ví dụ 0xFF, hoặc (khét tiếng) Octal Literals ví dụ 010. Trong JSON bạn chỉ có thể sử dụng các chữ số thập phân.

// Invalid JSON: 
{ "foo": 0xFF } 

Có một số việc triển khai buggy (Firefox 3.5+, IE8 +, json2.js), nơi literals bát phân được phép sai, ví dụ JSON.parse('01') sẽ tạo ra một SyntaxError.

+34

+1 Câu trả lời hay nhưng có thể làm với việc nhấn mạnh việc subsetting: bất kỳ khai báo JSON hợp lệ nào cũng là khai báo JavaScript hợp lệ, nhưng không phải tất cả các khai báo JavaScript hợp lệ đều là khai báo JSON. –

+1

Cũng sẽ hữu ích để chứng minh cách duy nhất mà chúng tôi từng thấy JSON trong tệp Javascript; tức là bên trong một chuỗi. –

+0

@CMS mô tả nó hoàn hảo ở trên, nhưng tôi sẽ nói bạn có thể nói khá nhiều sự khác biệt bởi những gì JSON thực sự là viết tắt của ... đó là JavaScript Oject "Ký hiệu"! – Alex

21

JSON là biểu diễn chuỗi của đối tượng. Nó là một định dạng tuần tự tương thích. Nó không chỉ gắn với javascript. Ví dụ, có serializers JSON cho .NET cho phép bạn serialize/deserialize các đối tượng .NET.

Vì vậy, nó chỉ là một định dạng cho phép bạn chuyển đổi từ các đối tượng thành chuỗi và ngược lại thuận tiện nếu bạn muốn chuyển chúng qua dây.

Nó rất gần với biểu diễn đối tượng javascript và nếu bạn chỉ đơn giản là eval() chuỗi JSON, bạn sẽ nhận được đối tượng tương ứng.

+3

Đừng để Crockford nghe bạn nói rằng ... – nickf

+4

@nickf, thư viện json2.js của Crockford thực hiện điều đó, 'eval' sau khi một số" xác thực regex ", nó không làm bất cứ điều gì của * phân tích cú pháp *: P. Trên thực tế, ngay cả thư viện riêng của anh * cũng có một số sai lệch từ [RFC riêng của anh] (http://www.ietf.org/rfc/rfc4627.txt?number=4627) !, ví dụ, json2.js có thể sai " phân tích cú pháp "Octal literals, ví dụ:" JSON.parse ("01") '... Tôi thấy nó buồn cười: P – CMS

+0

@CMS Vâng, tôi đoán Doug sẽ phản đối cụm từ" đơn giản "eval()' "sau đó ... (Sans xác nhận regex và như vậy) – nickf

1

JSON là một định dạng trao đổi dữ liệu, chỉ xảy ra giống như một tập con của YAML hoặc mã JavaScript mà bạn có thể thực thi và lấy lại đối tượng. Một đối tượng JavaScript chỉ là một đối tượng trong JavaScript.

Với JSON là định dạng trao đổi dữ liệu, bạn có thể trao đổi dữ liệu có cấu trúc trong một dạng văn bản với nó. Nó được tách ra từ JavaScript ngay bây giờ. Đối tượng JavaScript cho phép bạn tạo và làm việc với dữ liệu có cấu trúc trong khi thực hiện chương trình JavaScript.

Các vấn đề liên quan