JSON là gì và tại sao tôi sẽ sử dụng nó?


542

Tôi đã xem trên wikipedia và Googled nó và đọc tài liệu chính thức, nhưng tôi vẫn chưa hiểu được tôi thực sự hiểu JSON là gì và tại sao tôi lại sử dụng nó.

Tôi đã xây dựng các ứng dụng bằng PHP, MySQL và Javascript / HTML trong một thời gian và nếu JSON có thể làm điều gì đó để làm cho cuộc sống của tôi dễ dàng hơn hoặc mã của tôi tốt hơn hoặc giao diện người dùng của tôi tốt hơn, thì tôi muốn biết về nó. Ai đó có thể cho tôi một lời giải thích ngắn gọn?


2
JSON là một tập hợp con của YAML yaml.org
Brad Gilbert

15
copterlabs.com/blog/json-what-it-is-how-it-works-how-to-use-it đây là một ví dụ đơn giản về cách sử dụng
Tom

1
Ngoài ra, hãy đọc về I-JSON: tbray.org/ongiến/When/201x/2015/03/23/i-json
Roussy

1
+ Brad Gilbert Không thực sự - đó là cách riêng để thể hiện dữ liệu và tương tự như JSON chỉ vì cả hai đều thể hiện các đối tượng dưới dạng chuỗi (tương tự như XML hoặc plists hoặc nhiều thứ khác), nhưng JSON tốt hơn cho việc viết bằng máy và YAML cho việc viết của con người .
Ben Aubin

Câu trả lời:


649

JSON (Ký hiệu đối tượng JavaScript) là một định dạng nhẹ được sử dụng để trao đổi dữ liệu. Nó dựa trên một tập hợp con của ngôn ngữ JavaScript (cách các đối tượng được xây dựng bằng JavaScript). Như đã nêu trong MDN , một số JavaScript không phải là JSON và một số JSON không phải là JavaScript.

Một ví dụ về nơi này được sử dụng là phản hồi dịch vụ web. Vào thời xưa, các dịch vụ web đã sử dụng XML làm định dạng dữ liệu chính của chúng để truyền dữ liệu trở lại, nhưng kể từ khi JSON xuất hiện ( Định dạng JSON được chỉ định trong RFC 4627 bởi Douglas Crockford ), nó đã được định dạng ưa thích vì nó nhiều hơn nhẹ

Bạn có thể tìm thấy nhiều thông tin hơn trên trang web JSON chính thức .

JSON được xây dựng trên hai cấu trúc:

  • Một bộ sưu tập các cặp tên / giá trị. Trong các ngôn ngữ khác nhau, điều này được nhận ra dưới dạng một đối tượng, bản ghi, cấu trúc, từ điển, bảng băm, danh sách khóa hoặc mảng kết hợp.
  • Một danh sách sắp xếp các giá trị. Trong hầu hết các ngôn ngữ, điều này được nhận ra dưới dạng một mảng, vectơ, danh sách hoặc chuỗi.

Cấu trúc JSON



Sơ đồ đối tượng JSON

Sơ đồ mảng JSON

Biểu đồ giá trị JSON

Sơ đồ chuỗi JSON

Sơ đồ số JSON

Đây là một ví dụ về dữ liệu JSON:

{
     "firstName": "John",
     "lastName": "Smith",
     "address": {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": 10021
     },
     "phoneNumbers": [
         "212 555-1234",
         "646 555-4567"
     ]
 }

JSON trong JavaScript

JSON (trong Javascript) là một chuỗi!

Mọi người thường cho rằng tất cả các đối tượng Javascript là JSON và JSON là đối tượng Javascript. Điều này là không chính xác.

Trong Javascript không phảivar x = {x:y}JSON , đây là một đối tượng Javascript . Cả hai không giống nhau. Tương đương JSON (được biểu thị bằng ngôn ngữ Javascript) sẽ là var x = '{"x":"y"}'. xlà một đối tượng của chuỗi kiểu không phải là một đối tượng theo quyền riêng của nó. Để tắt chức năng này vào một đối tượng Javascript đủ lông đủ cánh trước tiên bạn phải phân tích nó, var x = JSON.parse('{"x":"y"}');, xbây giờ là một đối tượng nhưng đây không phải là JSON nữa.

Xem đối tượng Javascript Vs JSON


Khi làm việc với JSON và JavaScript, bạn có thể muốn sử dụng evalhàm để đánh giá kết quả được trả về trong cuộc gọi lại, nhưng điều này không được đề xuất vì có hai ký tự (U + 2028 & U + 2029) hợp lệ trong JSON nhưng không có trong JavaScript (đọc thêm về điều này ở đây ).

Do đó, người ta phải luôn cố gắng sử dụng tập lệnh của Crockford để kiểm tra JSON hợp lệ trước khi đánh giá nó. Liên kết đến phần giải thích tập lệnh được tìm thấy ở đây và đây là một liên kết trực tiếp đến tập tin js. Mỗi trình duyệt lớn hiện nay đều có cách thực hiện riêng cho việc này.

Ví dụ về cách sử dụng trình phân tích cú pháp JSON (với json từ đoạn mã trên):

//The callback function that will be executed once data is received from the server
var callback = function (result) {
    var johnny = JSON.parse(result);
    //Now, the variable 'johnny' is an object that contains all of the properties 
    //from the above code snippet (the json example)
    alert(johnny.firstName + ' ' + johnny.lastName); //Will alert 'John Smith'
};

Trình phân tích cú pháp JSON cũng cung cấp một phương thức rất hữu ích khác stringify. Phương thức này chấp nhận một đối tượng JavaScript làm tham số và xuất ra một chuỗi có định dạng JSON. Điều này hữu ích khi bạn muốn gửi dữ liệu trở lại máy chủ:

var anObject = {name: "Andreas", surname : "Grech", age : 20};
var jsonFormat = JSON.stringify(anObject);
//The above method will output this: {"name":"Andreas","surname":"Grech","age":20}

Hai phương thức trên ( parsestringify) cũng lấy tham số thứ hai, đó là một hàm sẽ được gọi cho mọi khóa và giá trị ở mọi cấp của kết quả cuối cùng và mỗi giá trị sẽ được thay thế bằng kết quả của hàm được nhập. (Thêm về điều này ở đây )

Btw, đối với tất cả các bạn ngoài kia, những người nghĩ rằng JSON chỉ dành cho JavaScript, hãy xem bài đăng này giải thích và xác nhận khác.


Người giới thiệu


1
Bất kể cách thông tin được tuần tự hóa, bạn sẽ có một trình phân tích cú pháp, phải không? Do đó, ai quan tâm định dạng bạn sử dụng để truyền dữ liệu nếu chi tiết triển khai của nó sẽ bị trừu tượng hóa.
Tom Lehman

6
Thực ra, nếu bạn đang truyền dữ liệu tới và chạy máy khách và máy chủ, tôi nghĩ việc cẩn thận với kích thước phản hồi của bạn là khá quan trọng.
Andreas Grech

9
Đối với pedantic, có một vài ký tự mà JSON xử lý khác với JavaScript, ngăn không cho nó trở thành một tập hợp con nghiêm ngặt: timlessrepo.com/json-isnt-a-javascript-subset
Jeremy Banks

Khi bạn nói rằng nó nhẹ hơn so với XML, bạn đang đề cập đến kích thước tệp hay trọng lượng nhẹ có ý nghĩa không gian trong mã hóa?
whatahitson

1
Vậy bạn sẽ thay thế XML bằng JSON chứ? Đó là những gì bạn nói? Nếu vậy ... Tuyệt vời, xml là một cơn ác mộng.
James111

66

Khái niệm được giải thích - Không có mã hoặc biệt ngữ kỹ thuật

JSON là gì? - Làm thế nào tôi giải thích nó với vợ tôi TM

Tôi: về cơ bản là cách giao tiếp với ai đó bằng văn bản .... nhưng với những quy tắc rất cụ thể.

Vợ: ừ ....?

Tôi: Trong tiếng Anh prosaic, các quy tắc khá lỏng lẻo: giống như với lồng đấu. Không như vậy với JSON. Có nhiều cách để mô tả một cái gì đó:

• Ví dụ 1: Gia đình chúng tôi có 4 người: Bạn, tôi và 2 con.

• Ví dụ 2: Gia đình của chúng tôi: bạn, tôi, kid1 và kid2.

• Ví dụ 3: Gia đình: [bạn, tôi, kid1, kid2]

• Ví dụ 4: chúng tôi có 4 người trong gia đình: mẹ, bố, bé1 và bé2.

Vợ: Tại sao họ không sử dụng tiếng Anh đơn giản?

Tôi: Họ sẽ, nhưng hãy nhớ rằng chúng ta đang làm việc với máy tính. Một máy tính là ngu ngốc và sẽ không thể hiểu câu. Vì vậy, chúng ta phải thực sự cụ thể khi máy tính có liên quan nếu không chúng bị lẫn lộn. Hơn nữa, JSON là một cách giao tiếp khá hiệu quả, do đó, hầu hết những thứ không liên quan đều bị cắt bỏ, điều này khá thuận tay. Nếu bạn muốn liên lạc với gia đình chúng tôi, với máy tính, một cách bạn có thể làm là như thế này:

{
                "Family" :  ["Me", "Wife", "Kid1", "Kid2"] 
}

Về cơ bản và đó là JSON. Nhưng hãy nhớ rằng, bạn PHẢI tuân thủ các quy tắc ngữ pháp JSON. Nếu bạn phá vỡ các quy tắc đó, thì máy tính sẽ không hiểu (nghĩa là phân tích) những gì bạn đang viết.

Vợ: Vậy làm thế nào để tôi viết trong Json?

Một cách tốt sẽ là sử dụng một serial serial json - đó là một thư viện giúp nâng đỡ bạn rất nhiều.

Tóm lược

JSON về cơ bản là một cách để truyền đạt dữ liệu tới ai đó, với các quy tắc rất, rất cụ thể. Sử dụng cặp giá trị chính và mảng. Đây là khái niệm được giải thích, tại thời điểm này nó đáng để đọc các quy tắc cụ thể ở trên.


48

Nói tóm lại - JSON là một cách tuần tự hóa theo cách như vậy, nó trở thành mã JavaScript. Khi được thực thi (với eval hoặc cách khác), mã này tạo và trả về một đối tượng JavaScript chứa dữ liệu bạn đã tuần tự hóa. Điều này khả dụng vì JavaScript cho phép cú pháp sau:

var MyArray = [ 1, 2, 3, 4]; // MyArray is now an array with 4 elements
var MyObject = {
    'StringProperty' : 'Value',
    'IntProperty' : 12,
    'ArrayProperty' : [ 1, 2, 3],
    'ObjectProperty' : { 'SubObjectProperty': 'SomeValue' }
}; // MyObject is now an object with property values set.

Bạn có thể sử dụng điều này cho một số mục đích. Đối với một, đây là một cách thoải mái để truyền dữ liệu từ phụ trợ máy chủ của bạn sang mã JavaScript. Vì vậy, điều này thường được sử dụng trong AJAX.

Bạn cũng có thể sử dụng nó như một cơ chế tuần tự hóa độc lập, đơn giản hơn và chiếm ít không gian hơn XML. Nhiều thư viện tồn tại cho phép bạn tuần tự hóa và giải tuần tự hóa các đối tượng trong JSON cho các ngôn ngữ lập trình khác nhau.


31

Nói tóm lại, nó là một ký hiệu kịch bản để truyền dữ liệu về. Theo một số cách thay thế cho XML, thực sự hỗ trợ các kiểu dữ liệu cơ bản, mảng và mảng kết hợp (cặp giá trị tên, được gọi là Đối tượng vì đó là những gì chúng thể hiện).

Cú pháp được sử dụng trong JavaScript và JSON là viết tắt của "Ký hiệu đối tượng JavaScript". Tuy nhiên, nó đã trở thành di động và cũng được sử dụng trong các ngôn ngữ khác.

Một liên kết hữu ích để biết chi tiết ở đây:

http://secretgeek.net/json_3mins.asp


19

Định dạng JSON thường được sử dụng để tuần tự hóa và truyền dữ liệu có cấu trúc qua kết nối mạng. Nó được sử dụng chủ yếu để truyền dữ liệu giữa máy chủ và ứng dụng web, phục vụ như là một thay thế cho XML.


16

JSON là ký hiệu đối tượng JavaScript. Đó là một cách nhỏ gọn hơn nhiều để truyền các bộ dữ liệu qua các kết nối mạng so với XML. Tôi đề nghị JSON được sử dụng trong bất kỳ ứng dụng nào giống AJAX trong đó XML sẽ là tùy chọn "được đề xuất". Độ dài của XML sẽ thêm vào thời gian tải xuống và tăng mức tiêu thụ băng thông ($$$). Bạn có thể thực hiện hiệu ứng tương tự với JSON và việc đánh dấu của nó hầu như chỉ dành riêng cho dữ liệu chứ không phải cấu trúc cơ bản.


11

câu trả lời ngắn phổ biến là: nếu bạn đang sử dụng AJAX để thực hiện các yêu cầu dữ liệu, bạn có thể dễ dàng gửi và trả về các đối tượng dưới dạng chuỗi JSON. Các tiện ích mở rộng có sẵn cho Javascript hỗ trợ các cuộc gọi toJSON () trên tất cả các loại javascript để gửi dữ liệu đến máy chủ trong yêu cầu AJAX. Các phản hồi AJAX có thể trả về các đối tượng dưới dạng các chuỗi JSON có thể được chuyển đổi thành các đối tượng Javascript bằng một lệnh gọi đơn giản, ví dụ: nếu hàm AJAX someAjaxFunctionCallReturnJson trả về

"{ \"FirstName\" : \"Fred\", \"LastName\" : \"Flintstone\" }"

bạn có thể viết bằng Javascript

var obj = eval("(" + someAjaxFunctionCallReturningJson().value + ")");
alert(obj.FirstName);
alert(obj.LastName);

JSON cũng có thể được sử dụng cho tải trọng dịch vụ web et al, nhưng nó thực sự thuận tiện cho kết quả AJAX.

  • Cập nhật (mười năm sau): Đừng làm điều này, hãy sử dụng JSON.parse

1
Với eval (), mọi thứ sẽ được đánh giá. đó là một rủi ro bảo mật.
Thomas Weller

@ThomasWeller vâng câu trả lời này là cổ xưa, tôi sẽ đi với JSON. Bây giờ cảm ơn!
Steven A. Lowe

8

Tôi thích JSON chủ yếu vì nó quá ngắn gọn . Đối với nội dung web có thể được nén, điều này không nhất thiết phải là vấn đề lớn (do đó tại sao x html rất phổ biến). Nhưng có những dịp mà điều này có thể có lợi.

Ví dụ, đối với một dự án tôi đang truyền thông tin cần được tuần tự hóa và truyền qua XMPP . Vì hầu hết các máy chủ sẽ giới hạn lượng dữ liệu bạn có thể truyền trong một tin nhắn, tôi thấy thật hữu ích khi sử dụng JSON thay cho XML thay thế rõ ràng.

Là một phần thưởng bổ sung, nếu bạn quen thuộc với Python hoặc Javascript, bạn đã biết khá nhiều về JSON và có thể diễn giải nó mà không cần đào tạo nhiều.


8

JSON là gì?

Ký hiệu đối tượng JavaScript (JSON) là một định dạng trao đổi dữ liệu nhẹ được lấy cảm hứng từ các đối tượng bằng chữ JavaScript.

Các giá trị JSON có thể bao gồm:

các đối tượng (tập hợp các cặp tên-giá trị) mảng (danh sách các giá trị được sắp xếp) chuỗi (trong dấu ngoặc kép) số đúng, sai hoặc null

JSON là ngôn ngữ độc lập.

JSON với PHP?

Sau phiên bản PHP 5.2.0, phần mở rộng JSON được giải mã và mã hóa các chức năng như mặc định.

Json_encode - trả về đại diện JSON của các giá trị Json_decode - Giải mã chuỗi JSON Json_last_error - Trả về lỗi cuối cùng xảy ra.

Cú pháp và quy tắc JSON?

Cú pháp JSON có nguồn gốc từ cú pháp ký hiệu đối tượng JavaScript:

Dữ liệu nằm trong cặp tên / giá trị Dữ liệu được phân tách bằng dấu phẩy Dấu ngoặc nhọn giữ đối tượng Dấu ngoặc vuông giữ mảng


4

Chúng tôi phải thực hiện một dự án về đại học và chúng tôi phải đối mặt với một vấn đề rất lớn, đó là Chính sách Xuất xứ Tương tự. Không có gì khác, nó làm cho phương thức XMLHttpRequest của bạn từ Javascript không thể thực hiện các yêu cầu đến các tên miền khác ngoài miền mà trang web của bạn đang truy cập.

Ví dụ: bạn không thể thực hiện yêu cầu tới www.otherexample.com nếu trang web của bạn ở trên www.example.com. JSONRequest cho phép điều đó, nhưng bạn sẽ nhận được kết quả ở định dạng JSON nếu trang web đó cho phép điều đó (ví dụ: nó có dịch vụ web trả về các thông báo trong JSON). Đó là một vấn đề mà bạn có thể sử dụng JSON.

Đây là một cái gì đó thiết thực: Yahoo JSON


4

Sự khác biệt giữa JSON và cú pháp thông thường sẽ như sau (trong Javascript)

Thông thường

 function Employee(name, Id, Phone, email){

      this.name = name;
      this.Id = Id;
      this.Phone = Phone;
      this.email = email;
  }

  //access or call it as 

var Emp = new Employee("mike","123","9373849784","mike.Anderson@office.com");

Với JSON

nếu chúng ta sử dụng JSON, chúng ta có thể định nghĩa theo nhiều cách khác nhau như

  function Employee(args){

   this.name = args.name;
   this.Id = args.Id;
   this.Phone = args.Phone;
   this.email = args.email;
}

//now access this as...

var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'mike.adnersone@office.com'});

Điều quan trọng chúng ta phải nhớ là, nếu chúng ta phải xây dựng lớp "Nhân viên" hoặc phương thức với 100 phần tử mà không có phương thức JSON, chúng ta phải phân tích mọi thứ khi tạo lớp. Nhưng với JSON, chúng ta chỉ có thể định nghĩa các đối tượng nội tuyến khi một đối tượng mới cho lớp được định nghĩa.

vì vậy dòng này dưới đây là cách thực hiện với JSON (chỉ là một cách đơn giản để xác định mọi thứ)

 var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'mike.adnersone@office.com'});

2
Đó không chính xác là JSON - đó là Đối tượng Javascript (không phải JSON)
Ben Aubin

4

Đôi khi tính kỹ thuật được đưa ra khi không yêu cầu và trong khi nhiều câu trả lời được bình chọn hàng đầu là chính xác và kỹ thuật cụ thể, cá nhân tôi không nghĩ rằng chúng dễ hiểu hơn, hay ngắn gọn, như những gì có thể tìm thấy trên Wikipedia, hoặc trong tài liệu chính thức.

Cách tôi nghĩ về JSON là chính xác nó là gì - một ngôn ngữ trong một thế giới của các ngôn ngữ khác nhau. Tuy nhiên, điểm khác biệt giữa JSON và các ngôn ngữ khác là "mọi người" "nói" JSON, cùng với "ngôn ngữ bản địa" của chúng.

Sử dụng một ví dụ trong thế giới thực, hãy giả vờ rằng chúng ta có ba người. Một người nói tiếng Igbo như tiếng mẹ đẻ của họ. Người thứ hai muốn tương tác với người thứ nhất, tuy nhiên, người thứ nhất nói tiếng Yoruba như ngôn ngữ đầu tiên của họ.

Chúng ta có thể làm gì?

Rất may, người thứ ba trong ví dụ của chúng tôi lớn lên nói tiếng Anh, nhưng cũng tình cờ nói cả tiếng Igbo và Yoruba như ngôn ngữ thứ hai, và do đó có thể đóng vai trò trung gian giữa hai cá nhân đầu tiên.

Trong thế giới lập trình, "người" đầu tiên là Python, "người" thứ hai là Ruby và "người thứ ba" là JSON, người rất tình cờ có thể "dịch" Ruby sang Python và ngược lại! Bây giờ rõ ràng sự tương tự này không phải là một thứ hoàn hảo, nhưng, như một người biết song ngữ, tôi tin rằng đó là một cách dễ dàng để xem cách JSON tương tác với các ngôn ngữ lập trình khác.


2

Nó rất đơn giản. JSON là viết tắt của ký hiệu đối tượng tập lệnh Java. Hãy nghĩ về nó như một cách thay thế cho việc sử dụng XML để truyền dữ liệu giữa các thành phần phần mềm.

Ví dụ, gần đây tôi đã viết một loạt các dịch vụ web trả về JSON và một số nhà phát triển Javascript sau đó đã viết mã gọi các dịch vụ đó và sử dụng thông tin được trả về ở định dạng đó.


2

JSON (ký hiệu đối tượng Javascript) là định dạng dữ liệu trọng lượng nhẹ để trao đổi / truyền dữ liệu. Trong cặp giá trị chính của nó là JavaScript. Đối với API REST, nó được sử dụng rộng rãi để truyền dữ liệu từ máy chủ đến máy khách. Ngày nay nhiều trang web truyền thông xã hội đang sử dụng điều này. Mặc dù tôi không thấy điều này mạnh mẽ như XML đối với các loại dữ liệu. XML có các kiểu dữ liệu và XSD rất phong phú. JSON là một chút thiếu trong này.

Với cùng một lượng dữ liệu chuỗi, JSON sẽ nhẹ hơn so với XML vì XML có tất cả các thẻ mở và đóng, v.v ...


0

Trong ngữ cảnh Java, một lý do tại sao JSON có thể muốn được sử dụng, là nó cung cấp một sự thay thế rất tốt cho khung công tác Tuần tự hóa của Java, đã được chứng minh (về mặt lịch sử) phải chịu một số lỗ hổng khá nghiêm trọng.

Joshua Bloch thảo luận sâu về vấn đề này trong Mục 85 "Ưu tiên các lựa chọn thay thế cho tuần tự hóa Java" (Phiên bản thứ 3 hiệu quả của Java)

Tuần tự hóa của Java ban đầu có nghĩa là dịch các cấu trúc dữ liệu sang định dạng có thể dễ dàng truyền hoặc lưu trữ. JSON đáp ứng yêu cầu này mà không cần khai thác nghiêm túc được đề cập ở trên.


-3

Hãy thử đoạn mã sau để phân tích phản hồi php json của bạn: read.php

<script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>
<script type="text/javascript">  
$.ajax({
    url:'index.php',
    data:{},
    type:"POST",
    success:function(result) {
        jsondecoded = $.parseJSON(result);
        $.each(jsondecoded, function(index, value) {
            $("#servers").text($("#servers").text() + " " + value.servername);
            console.log(value.start);
            console.log(value.end);
            console.log(value.id);
        });
    },
    statusCode: {
    404: function() {
      alert( "page not found" );
    }
  }
});
</script>

máy chủ.php

<?php 
echo '[{"start":"2017-08-29","end":"2017-09-01","id":"22"},{"start":"2017-09-03","end":"2017-09-06","id":"23"}]';
?>

Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Nic3500
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.