Giới thiệu về JSON
- 21-09-2023
- Toanngo92
- 0 Comments
Mặc dù XML có thể thích ứng với một số tình huống ứng dụng, nhưng nó có một vài nhược điểm, do đó nó không được coi là lý tưởng trong một số tình huống. Một tình huống như vậy là sử dụng XML với các ứng dụng dựa trên XML và JavaScript không đồng bộ (AJAX),
AJAX đề cập đến một kỹ thuật phát triển để thiết kế các ứng dụng tương tác cho Web. Các ứng dụng này mang lại trải nghiệm sống động bằng cách thực hiện các cuộc gọi máy khách-máy chủ ngoài băng tần, nhẹ, thông qua một kênh riêng biệt nhằm trao đổi thông tin từ các dịch vụ từ xa. Nói một cách đơn giản, các trình tự cập nhật và định tuyến xảy ra bên ngoài ngữ cảnh máy khách-máy chủ thông thường, dẫn đến việc làm mới màn hình trong khi thông tin được lấy ở chế độ nền (ngoài băng thông).
Khi một trình duyệt nhận được các bản cập nhật, XML sẽ phân tích cú pháp văn bản bằng cách sử dụng Mô hình đối tượng tài liệu (DOM). Mô hình này có một đường cong cao. Truy cập dữ liệu đơn giản hoặc sửa đổi nó thông qua DOM sẽ kích hoạt nhiều lệnh gọi phương thức. Hơn nữa, DOM hoạt động khác nhau trong mỗi trình duyệt, do đó quá trình phân tích cú pháp hoặc sửa đổi yêu cầu triển khai một sơ đồ lập trình phức tạp. Tuy nhiên, có khả năng xảy ra lỗi trong khả năng tương thích giữa các trình duyệt.
Điều này kích hoạt nhu cầu về một thành phần có thể dễ dàng kết hợp ngôn ngữ đánh dấu vào trang Web HTML theo yêu cầu AJAX trong tất cả các trình duyệt chính. Thành phần này là công cụ JavaScript. Thay vì gửi các bản cập nhật AJAX ở định dạng XML tùy thuộc vào DOM phức tạp để phân tích cú pháp, định dạng tự nhiên và phù hợp hơn với công cụ JavaScript chắc chắn là một cách tiếp cận tốt hơn.
Do đó, một định dạng như vậy đã được giới thiệu, được gọi là Javascript object notation – Ký hiệu đối tượng JavaScript (JSON).
Mục lục
Khái niệm JSON
Theo JSON.org, định nghĩa chính thức cho biết JSON là ‘một định dạng trao đổi dữ liệu tiêu chuẩn nhẹ, dựa trên văn bản và mở. Nó có thể đọc được và bắt nguồn từ ngôn ngữ JavaScript, như được định nghĩa bởi ECMAScript Standard, Phiên bản thứ ba.
Định dạng văn bản này là nền tảng cũng như ngôn ngữ độc lập. Tuy nhiên, nó thực hiện các quy ước mà các lập trình viên của ngôn ngữ dựa trên C đã biết, chẳng hạn như C, Cit, C++, Perl, JavaScript và Java. JSON không chỉ giới hạn trong các ứng dụng AJAX mà còn có thể sử dụng được trong hầu hết mọi môi trường nơi các ứng dụng cần lưu trữ hoặc trao đổi dữ liệu có cấu trúc.
JSON ngắn gọn hơn XML. Thực tế là nó bắt nguồn từ JavaScript và có lợi cho việc sử dụng nó với các ứng dụng Web thực hiện nhiều trao đổi dữ liệu. Định dạng dữ liệu này là lý tưởng để biểu diễn hoặc lưu trữ dữ liệu bán cấu trúc.
Không giống như các mô hình dữ liệu khác, chẳng hạn như XML hoặc Cơ sở dữ liệu quan hệ, việc tìm hiểu JSON dễ dàng và nhanh chóng hơn. Kiến thức về JavaScript, Bộ tiền xử lý siêu văn bản (PHP) hoặc Java cho biết rằng nhà phát triển đã
biết về cấu trúc dữ liệu JSON.
Ban đầu, JSON dựa trên một tập hợp con gọn nhẹ của JavaScript và ECMAScript. Mặc dù nó được sử dụng với JavaScript, nhưng nó cho phép một số ký tự không thoát trong chuỗi, được coi là không hợp lệ trong ECMAScript và JavaScript.
Mã để tạo và phân tích cú pháp dữ liệu JSON có sẵn trong một số ngôn ngữ lập trình. Json.org, trang web chính thức của JSON, phân loại các thư viện JSON theo ngôn ngữ.
Công dụng của JSON
Ví dụ, JSON được ưa thích rộng rãi để tuần tự hóa và gửi dữ liệu qua mạng, giữa ứng dụng Web và máy chủ Web. Tuần tự hóa biến đổi cấu trúc dữ liệu sang định dạng phù hợp để truyền qua mạng hoặc để lưu trữ trong bộ nhớ đệm hoặc tệp để truy xuất sau này
JSON, dưới dạng định dạng trao đổi dữ liệu, cũng được sử dụng để hỗ trợ giao tiếp giữa các nền tảng không tương thích. Chẳng hạn, ứng dụng Java trên UNIX có thể gửi thông tin đến ứng dụng Visual Basic chạy trên Windows bằng cách sử dụng JSON.
Khi XML được giới thiệu vào cuối những năm 90, đó là một lợi ích đối với một số nhà quản lý doanh nghiệp do giao diện giống như HTML trực quan của nó. Mặt khác, các nhà phát triển biết rằng việc phân tích cú pháp XML không đơn giản. Ngay cả ngày nay, mặc dù có nhiều thư viện lập trình để đơn giản hóa việc phân tích cú pháp, tìm kiếm dữ liệu theo thứ bậc và trích xuất các thuộc tính nút, nhưng đường cong nghiêng vẫn còn cao trong khi xử lý các thẻ. Sau đó, các khung, chẳng hạn như Spring và Struts, đã cung cấp một số phương tiện để tạo các thẻ ‘tấm nồi hơi’. Hiện tại, JSON cung cấp một cách dễ nhận biết hơn để xử lý các thẻ và cấu trúc dữ liệu.
JSON cũng được ưa thích để phát triển các ứng dụng dựa trên JavaScript, chẳng hạn như các trang Web và tiện ích mở rộng trình duyệt. Ngay cả các giao diện Lập trình ứng dụng (API) và các dịch vụ Web cũng sử dụng JSON để gửi dữ liệu công khai
Hãy tưởng tượng một cửa hàng bán lẻ trên Web cung cấp nhiều loại sản phẩm để bán. Mỗi sản phẩm sẽ đại diện cho một phần tử với các thuộc tính lưu trữ các chi tiết tương ứng như mô tả, giá cả và URL tới hình ảnh sản phẩm. Để sử dụng dữ liệu được lưu trữ này trong trang web, nhà phát triển có thể tìm nạp dữ liệu đó mà không cần mã hóa cứng bất kỳ sản phẩm nào trong HTML. Một trong những ví dụ thực tế là eBay trong đó thay vì mã hóa cứng từng sản phẩm, một mẫu xác định trang web đó sẽ trông như thế nào đối với khách truy cập. Dữ liệu cần thiết sau đó được tìm nạp từ tệp JSON trên máy chủ.
Lịch sử của JSON
JSON được giới thiệu để đáp ứng đầy đủ yêu cầu trao đổi dữ liệu có trạng thái, theo thời gian thực giữa máy chủ và máy khách nhưng không có các plugin như ứng dụng Java. Mặc dù Douglas Crockford ban đầu chỉ định định dạng mới này, thuật ngữ này lần đầu tiên được đặt ra tại Công ty Phần mềm do những người đồng sáng lập là Robert F, Chip Morningstar và Crockford.
Những người đồng sáng lập đã quyết định phát triển một hệ thống có thể khai thác tiềm năng trình duyệt thông thường cũng như cung cấp lớp trừu tượng để thiết kế các ứng dụng có trạng thái cho Web. Các ứng dụng này phải duy trì kết nối liên tục với máy chủ bằng cách mở hai kết nối Giao thức truyền siêu văn bản (HTTP). Các kết nối này phải được tái sử dụng trước thời gian chờ thông thường của trình duyệt, trong trường hợp không trao đổi dữ liệu nữa. Một trong những người đồng sáng lập Morningstar đã phát triển ý tưởng về Khung ứng dụng trạng thái như vậy.
Khi nhận ra tiềm năng ban đầu của AJAX, các công ty như digiGroups và Noosh đã triển khai các khung để gửi thông tin đến trình duyệt. Tuy nhiên, điều này được thực hiện mà không làm mới bối cảnh trực quan của ứng dụng thời gian thực, nhận ra rằng các ứng dụng đó chỉ sử dụng HTTP cơ bản, JavaScript và HTML cơ bản của Internet Explorer 5+ và Netscape 4.0.5+. Đối với một hệ thống như vậy, Crockford sớm phát hiện ra rằng có thể triển khai JavaScript dưới dạng định dạng dựa trên đối tượng để nhắn tin. Sau đó, một hệ thống ứng dụng đã được phát triển và bán cho Sun Microsystems, EDS và Amazon. Năm 2002, JSON.org được xuất bản. Năm 2005, Yahoo triển khai JSON cho một số dịch vụ Web của mình. Một năm sau, ngay cả Google cũng đã triển khai JSON cho các nguồn cấp dữ liệu cho giao thức Web GData của mình. Năm 2013, JSON trở thành tiêu chuẩn ECMA-404, tiêu chuẩn quốc tế của ECMA.
Tính năng của JSON
Trong các ứng dụng doanh nghiệp, ngày càng có nhiều nhà phát triển chọn định dạng dữ liệu JSON. Các tính năng của JSON giải thích tại sao các nhà phát triển nên sử dụng nó trong các ứng dụng dựa trên Web của họ. Sau đây là các tính năng của JSON:
Cấu trúc tiêu chuẩn: Định dạng JSON có cấu trúc tiêu chuẩn, giúp nhà phát triển viết mã dễ dàng hơn.
Tính đơn giản: Việc biểu diễn dữ liệu ở định dạng JSON rất đơn giản, giúp nhà phát triển hiểu mã dễ dàng hơn. Ngay cả việc phân tích cú pháp cũng trở nên dễ dàng, bất kể ngôn ngữ chương trình đang được sử dụng là gì. Định dạng JSON nhỏ gọn và đơn giản cho phép truyền dữ liệu nhanh chóng trên các nền tảng để tiếp cận nhiều người dùng trên toàn cầu.
Tính Mở: JSON tương tự như XML về tính mở. Nó được cung cấp công khai và không phải là vấn đề cốt lõi của các cuộc đấu tranh chính trị/doanh nghiệp về tiêu chuẩn hóa. Người ta có thể dễ dàng tận dụng cấu trúc mở để thêm các yếu tố khác khi cần và điều chỉnh hệ thống để phù hợp với các thuật ngữ mới dành riêng cho ngành. Nếu các thuật ngữ này ở định dạng XML, người ta có thể tự động chuyển đổi chúng thành JSON vì việc di chuyển rất đơn giản.
Tự mô tả: JSON có tính chất tự mô tả, nghĩa là bạn có thể mô tả tên trường của chính mình và các giá trị cụ thể của chúng. Điều này cho phép các ứng dụng thao tác với dữ liệu JSON.
Nhẹ: Dữ liệu ở định dạng JSON không chiếm nhiều dung lượng lưu trữ. Việc lấy và tải dữ liệu đó một cách nhanh chóng cũng như không đồng bộ mà không cần tải lại trang cũng dễ dàng hơn. Điều này làm cho các ứng dụng AJAX hoạt động hiệu quả về mặt hiệu suất.
Có thể mở rộng/Tái sử dụng: Nếu nhà phát triển cần thay đổi ngôn ngữ lập trình trên máy chủ thì việc đó sẽ dễ dàng thực hiện hơn vì cấu trúc JSON vẫn giữ nguyên bất kể ngôn ngữ lập trình đang sử dụng. Giả sử một tình huống trong đó mã phía máy chủ hiển thị danh sách HTML nhưng nhà phát triển muốn nó có bảng HTML. Để điều này xảy ra, nhà phát triển sẽ viết lại mã ở cả phía máy chủ và máy khách. Thay vì điều này, bằng cách cấu trúc dữ liệu ở định dạng JSON, nhà phát triển chỉ phải sửa đổi mã hiển thị dữ liệu trên màn hình. Cấu trúc JSON vẫn giống nhau trên tất cả các ngôn ngữ lập trình, đảm bảo khả năng sử dụng lại và khả năng mở rộng.
Dữ liệu sạch: Với cấu trúc được tiêu chuẩn hóa, JSON ít bị lỗi hơn. Ứng dụng thu thập dữ liệu JSON biết cách lấy dữ liệu và những gì mong đợi, điều này khác với việc sử dụng HTML. Cấu trúc như vậy cũng giúp nhà phát triển cung cấp các giải pháp mạnh mẽ trên nhiều trình duyệt, rất hữu ích khi xem xét sự ra đời của các trình duyệt khác nhau trên thiết bị di động.
Hiệu quả: Trong khi sử dụng cấu trúc dữ liệu JSON, danh sách dữ liệu xuất ra trước đó sẽ được tạo hoặc sao chép ở phía máy khách. Điều này có nghĩa là chỉ những thông tin đã thay đổi mới được chuyển đến máy khách theo mọi yêu cầu. Sự tối ưu hóa nhỏ này có khả năng tăng cường cả hiệu suất và khả năng sử dụng của các ứng dụng Web, xét đến tốc độ kết nối Internet tăng nhanh.
Khả năng tương tác: Khả năng tương tác đạt được khi hai hoặc nhiều ứng dụng, mỗi ứng dụng được mã hóa bằng ngôn ngữ lập trình khác nhau, giao tiếp với nhau mà không gặp bất kỳ vấn đề nào. JSON tạo ra
các nhà phát triển đạt được khả năng tương tác vì nó được hầu hết các ngôn ngữ hỗ trợ do cú pháp đơn giản hơn.
Khả năng mở rộng: JSON chỉ cho phép lưu trữ dữ liệu tiêu chuẩn như số và văn bản. Mặt khác, XML cho phép lưu trữ bất kỳ loại dữ liệu nào. Mặc dù đây là một lợi ích của việc sử dụng XML nhưng nó cũng là một nhược điểm hoặc một nhược điểm vì nó khiến việc đọc trở nên khó khăn hơn một chút. Tất cả phụ thuộc vào loại thông tin cần chuyển. Một tài liệu có thể cần tính linh hoạt của XML để xử lý các thành phần định dạng như hình ảnh và đồ thị. Tuy nhiên, tính linh hoạt hoặc khả năng mở rộng này là không cần thiết để truyền dữ liệu cổ điển, điều này chỉ đơn giản cho thấy tính đơn giản của JSON.
Quốc tế hóa: JSON triển khai chuẩn Unicode nhờ đó các công cụ chung có thể dễ dàng thao tác với dữ liệu có cấu trúc của nó. Do đó, dữ liệu có cấu trúc này dễ dàng phân phối đến nhiều nền tảng cũng như người dùng.
JSON vs. XML
Cả JSON và XML đều có khả năng biểu diễn dữ liệu trong bộ nhớ ở định dạng văn bản có thể đọc được. Nghĩa là nhà phát triển có thể nêu trong tham số chuỗi truy vấn xem đầu ra phải ở định dạng XML hay JSON.
Do những điểm tương đồng như vậy, việc chọn định dạng trao đổi dữ liệu phù hợp từ cả hai có thể không đơn giản. Dưới đây là bảng đặc tả giúp chúng ta có thể xem xét các đặc điểm khác biệt của cả hai định dạng và tìm ra định dạng nào phù hợp hơn cho một ứng dụng cụ thể.
Characteristic | JSON | XML |
Kiểu dữ liệu | Cung cấp các kiểu dữ liệu vô hướng và trình bày dữ liệu có cấu trúc dưới dạng đối tượng và mảng. | Không đưa ra bất kỳ ý tưởng nào về các kiểu dữ liệu do đó việc dựa vào Lược đồ XML là cần thiết để xác định thông tin về các kiểu dữ liệu. |
Array Support | Hỗ trợ kiểu dữ liệu mảng | Thể hiện mảng theo quy ước. Ví dụ: XML sử dụng phần tử giữ chỗ bên ngoài để tạo thành nội dung trong một mảng dưới dạng phần tử bên trong. |
Object Support | Hỗ trợ kiểu dữ liệu đối tượng | Hỗ trợ đối tượng Cung cấp hỗ trợ gốc Thể hiện các đối tượng theo quy ước, thường bằng cách kết hợp các thuộc tính và thành phần. |
Null Support | Hỗ trợ giá trị null | Bắt buộc sử dụng xsi:nil trên các phần tử trong tài liệu phiên bản cùng với việc nhập namespace liên quan. |
Comments | Không hỗ trợ | Có hỗ trợ |
Namespaces | Không hỗ trợ namespace và xung đột đặt tên không xảy ra khi các đối tượng được lồng nhau hoặc tên thành viên đối tượng có tiền tố. | Chấp nhận các namespace để ngăn chặn xung đột tên và mở rộng một cách an toàn các tiêu chuẩn XML phổ biến. |
Định dạng | Định dạng Đơn giản và cung cấp nhiều ánh xạ dữ liệu trực tiếp hơn. | Rất phức tạp và cần nhiều nỗ lực hơn để ánh xạ các loại ứng dụng tới các phần tử. |
Kích thước | Có cú pháp rất ngắn, cung cấp văn bản được định dạng trong đó phần lớn không gian được chiếm bởi dữ liệu được trình bày. | Có tài liệu dài, đặc biệt trong trường hợp định dạng tập trung vào phần tử. |
Phân tích cú pháp trong JavaScript | Không cần ứng dụng bổ sung để phân tích cú pháp (JavaScripts eval() chức năng hoạt động tốt). | Triển khai XML DOM và yêu cầu mã bổ sung để ánh xạ văn bản tới các đối tượng JavaScript. |
Phân tích cú pháp | Phân tích cú pháp Có JSONPath để chọn các phần cụ thể của cấu trúc dữ liệu nhưng không được sử dụng rộng rãi | Có đặc tả XPath để thực hiện tương tự trong tài liệu XML và nó được sử dụng rộng rãi. |
Đường cong học tập | Dễ dàng bắt đầu do đã quen với cấu trúc và nền tảng của các ngôn ngữ lập trình động | Khó với nhu cầu biết một số công nghệ và khái niệm như XPath, XSL Transformations |
Độ phức tạp | Phức tạp | Phức tạp hơn |
Schema (metadata) | Có schema nhưng không sử dụng rộng rãi | Sử dụng nhiều thông số kỹ thuật để xác định schema, bao gồm Định nghĩa lược đồ XML (XSD) và Định nghĩa loại tài liệu (DTD). |
Định kiểu | Không có đặc điểm kỹ thuật đặc biệt. | Có đặc tả XSLT để định kiểu cho tài liệu XML. |
Truy vấn | Có các kỹ thuật truy vấn như Ngôn ngữ truy vấn JSON (JAQL) và JSONiq nhưng không được sử dụng rộng rãi. | Có đặc tả XQuery được sử dụng rộng rãi. |
Bảo mật | Ít bảo mật hơn, trình duyệt không có trình phân tích cú pháp JSON | Bảo mật hơn |
Là một định dạng mới để trao đổi dữ liệu, JSON không có quá nhiều sự hỗ trợ của nhà cung cấp như XML ngày nay. Tuy nhiên, JSON đang nhanh chóng nhận được sự hỗ trợ của nhà cung cấp.
Hỗ trợ | JSON | XML |
Công cụ | Thiếu các công cụ phong phú, chẳng hạn như trình soạn thảo. | Bộ công cụ được thiết lập từ một số nhà cung cấp. |
Nền tảng và ngôn ngữ | Có trình phân tích cú pháp và định dạng nguồn mở bằng nhiều ngôn ngữ và trên nhiều nền tảng. | Có cả trình phân tích cú pháp và định dạng mã nguồn mở và thương mại. |
Ngôn ngữ tích hợp | Chỉ được hỗ trợ trong JavaScript/ECMAScript | Đang được nhiều nhà cung cấp thử nghiệm để hỗ trợ bằng nhiều ngôn ngữ |
Ví dụ cùng sử dụng cấu trúc JSON và XML để lưu trữ đối tượng student:
{
"students": [
{
"name": "John Doe",
"student_id": 12345,
"courses": ["Math", "English", "History"],
"gpa": 3.8
},
{
"name": "Jane Smith",
"student_id": 67890,
"courses": ["Science", "Art", "Music"],
"gpa": 3.5
}
]
}
<students>
<student>
<name>John Doe</name>
<student_id>12345</student_id>
<courses>
<course>Math</course>
<course>English</course>
<course>History</course>
</courses>
<gpa>3.8</gpa>
</student>
<student>
<name>Jane Smith</name>
<student_id>67890</student_id>
<courses>
<course>Science</course>
<course>Art</course>
<course>Music</course>
</courses>
<gpa>3.5</gpa>
</student>
</students>
Ưu điểm của JSON
JSON chủ yếu được sử dụng để tuần tự hóa và hủy tuần tự hóa dữ liệu được gửi đến và từ một ứng dụng được tạo bằng JavaScript. Xem xét thực tế này, ưu điểm của JSON liên quan đến việc sử dụng JSON so với các tùy chọn khác để tuần tự hóa và hủy tuần tự hóa
Thông thường, trong môi trường XML, người gửi mã hóa dữ liệu cần được tuần tự hóa bằng cách sử dụng DTD mà người nhận có thể hiểu được. Nhiệm vụ này bao gồm rất nhiều phần đệm bổ sung xung quanh dữ liệu, bất kể DTD nào được sử dụng. Do đó, kích thước của tài liệu XML lớn hơn đáng kể so với giá trị dữ liệu thực tế được gửi. Sau đó, người nhận lấy luồng dữ liệu XML và giải mã nó để đưa vào bộ nhớ.
Tương tự, quá trình tuần tự hóa này nếu được thực hiện thông qua JSON sẽ nhanh hơn và gọn hơn do cấu trúc vốn có của định dạng. Cấu trúc JSON sử dụng các kiểu dữ liệu lập trình tiêu chuẩn có cấu trúc đơn giản dễ hiểu. Hơn nữa, cơ chế mã hóa đủ hiệu quả để chỉ thêm các ký tự tối thiểu cần thiết để phản ánh cấu trúc và giá trị dữ liệu. Khi người nhận nhận được dữ liệu được xê-ri hóa này, quy trình duy nhất cần có là đánh giá văn bản thông qua chức năng tương thích trong bất kỳ ngôn ngữ lập trình nào. Ví dụ: việc đánh giá có thể xảy ra bằng cách sử dụng hàm eval() của JavaScript.
Tiêu chuẩn khác để so sánh là Yaml Ain’t Markup Language (YAML) tuần tự hóa các tập dữ liệu phức tạp mà không cần DTD và dựa vào trình phân tích cú pháp đơn giản hơn XML. Ngay cả một trình phân tích cú pháp như vậy cũng tiêu tốn nhiều thời gian hơn JSON để xuất ra các luồng dữ liệu được tuần tự hóa lớn hơn.
Sau đây là một số lợi ích khác của việc sử dụng JSON:
- JSON phân tích cú pháp nhanh hơn XML và YAML.
- JSON hoạt động đơn giản hơn với một số ngôn ngữ như PHP, Python và JavaScript
- JSON dễ dàng ánh xạ tới hệ thống hướng đối tượng hơn vì nó hướng dữ liệu.
- JSON là một tập hợp con hợp lệ của Python và YAML ngoài JavaScript
- JSON dễ dàng phân biệt giữa chuỗi ‘2’ và số ‘2’ cũng như giữa một mục duy nhất và một tập hợp có kích thước (mảng).
- JSON là định dạng trao đổi dữ liệu lý tưởng chứ không phải định dạng trao đổi tài liệu lý tưởng như XML. Do đó, JSON không cần thiết phải có khả năng mở rộng để trao đổi tài liệu bằng cách xác định các thẻ mới để biểu diễn dữ liệu.
Hạn chế của JSON
Mặc dù lợi ích của JSON rất hấp dẫn nhưng cũng có những hạn chế. Hạn chế đáng kể nhất là hơi khó đọc định dạng JSON, định dạng này cũng yêu cầu giữ từng dấu ngoặc đơn và dấu phẩy ở đúng vị trí. Điều này cũng có thể áp dụng cho XML. Tuy nhiên, cấu trúc của JSON bao gồm cú pháp phức tạp như }]} ở cuối có thể khiến người mới bắt đầu sợ hãi cũng như khiến việc gỡ lỗi ban đầu trở nên phức tạp.
Cấu trúc lồng nhau phức tạp như vậy có vẻ đáng sợ đối với người mới sử dụng, tuy nhiên, khi thực hành, người ta có thể làm quen và hiểu rõ hơn về cách lưu trữ dữ liệu JSON.
Ví dụ cấu trúc JSON
{
"bookstore": {
"name": "Fictional Book Emporium",
"location": "123 Main Street, Imaginary City",
"books": [
{
"title": "The Great Novel",
"authors": [
{
"name": "Alice Author",
"birth_year": 1980
},
{
"name": "Bob Writer",
"birth_year": 1975
}
],
"publication_date": "2022-01-15",
"isbn": "978-1234567890",
"price": 24.99
},
{
"title": "Adventure Chronicles",
"authors": [
{
"name": "Eve Novelist",
"birth_year": 1990
}
],
"publication_date": "2021-05-10",
"isbn": "978-0987654321",
"price": 19.99
}
],
"customers": [
{
"name": "Customer One",
"email": "customer1@example.com",
"orders": [
{
"order_id": "001",
"order_date": "2023-09-19",
"items": [
{
"book_id": 1,
"quantity": 2
},
{
"book_id": 2,
"quantity": 1
}
]
}
]
},
{
"name": "Customer Two",
"email": "customer2@example.com",
"orders": [
{
"order_id": "002",
"order_date": "2023-09-18",
"items": [
{
"book_id": 1,
"quantity": 1
}
]
}
]
}
]
}
}
Quy tắc cú pháp và dữ liệu JSON
Dữ liệu JSON được biểu diễn dưới dạng cặp giá trị tên. Một cặp như vậy chứa tên trường trong dấu ngoặc kép, hậu tố là dấu hai chấm, sau đó giá trị được nêu. Giá trị JSON có thể là số nguyên, giá trị Boolean, chuỗi, mảng, đối tượng và null.
JSON hỗ trợ hai cấu trúc dữ liệu cụ thể là thứ tự các giá trị và tập hợp các cặp giá trị tên không có thứ tự. Danh sách có thứ tự có thể là một mảng, vectơ, danh sách hoặc chuỗi; trong khi tập hợp các cặp giá trị tên có thể được nhận dạng theo cách khác, tùy thuộc vào ngôn ngữ lập trình. Bộ sưu tập này có thể là một danh sách có khóa, đối tượng, bản ghi, cấu trúc hoặc bảng băm.
Cả hai cấu trúc dữ liệu này đều phổ biến, có nghĩa là hầu hết các ngôn ngữ lập trình hiện đại đều chấp nhận chúng. Điều hợp lý là JSON là một định dạng có thể hoán đổi cho nhau được hỗ trợ bởi các ngôn ngữ lập trình khác nhau cũng chấp nhận các cấu trúc này.
Trong JSON, các cấu trúc dữ liệu này có dạng được xác định trước. Một tập hợp các giá trị được sắp xếp theo thứ tự được coi là một mảng. Một mảng bắt đầu bằng dấu ngoặc vuông mở “[” và kết thúc bằng dấu ngoặc vuông đóng “]”. Trong các dấu ngoặc vuông này, các phần tử còn được gọi là giá trị được thêm vào, mỗi phần tử được phân tách bằng dấu phẩy.
Sự sắp xếp không có thứ tự của các cặp tên/giá trị hoặc khóa/giá trị được coi là một đối tượng. Một đối tượng bắt đầu bằng dấu ngoặc nhọn mở “{” và kết thúc bằng dấu ngoặc nhọn đóng “}”, Trong các dấu ngoặc nhọn này, mỗi tên được theo sau bởi dấu hai chấm để phân tách nó khỏi giá trị và mỗi cặp Khóa/giá trị theo sau là dấu phẩy.
Ví dụ cấu trúc JSON sau:
{
"name": "George Ganet",
"address": {
"Street": "123 Ashley Street",
"City": "Chicago",
"ZipCode": 60604
}
}
Trong đoạn mã trên, dễ dàng để xác định rằng name, address, strreet và City,ZipCode là tên hoặc khóa của đối tượng, mỗi tên đều có một giá trị. Cả khóa và giá trị đều nằm trong dấu ngoặc kép. Mỗi khóa được phân tách khỏi giá trị của nó bằng dấu hai chấm. Mặc dù không bắt buộc phải đưa giá trị số vào dấu nháy đôi nhưng các giá trị chuỗi phải luôn được đưa vào dấu nháy đôi.
Ví dụ cấu trúc JSON lỗi cú pháp:
{
"name": "John Doe",
"age": 30,
"city": New York
"email": "johndoe@example.com",
}
Ở đây, New York không được đưa vào dấu nháy đôi nên sẽ gặp lỗi cú pháp.
Cú pháp JSON bắt nguồn từ cú pháp ký hiệu đối tượng của JavaScript. Các quy tắc cú pháp sau đây được chấp nhận ngay cả trong JSON:
- Dữ liệu ở dạng cặp tên/giá trị và được phân tách bằng dấu phẩy.
- Tên và giá trị được phân tách bằng dấu hai chấm.
- Dấu ngoặc nhọn chứa đối tượng.
- Dấu ngoặc vuông chứa mảng.
Văn bản Ký hiệu (Literal Notation) trong JavaScript
Trong ngôn ngữ lập trình, literals được sử dụng để biểu thị các giá trị cố định theo nghĩa đen, chẳng hạn như giá trị nguyên không đổi là 1 hoặc giá trị chuỗi “Steve”. Bạn có thể sử dụng literals trong hầu hết các ngôn ngữ để mô tả một biểu thức. Một vài ví dụ về biểu thức như vậy bao gồm tham số đầu vào được truyền để gọi hàm, một phần của điều kiện trong câu lệnh điều khiển và một giá trị trong câu lệnh gán biến.
Các ngôn ngữ lập trình khác nhau chấp nhận các loại literal khác nhau. Hầu hết chúng đều hỗ trợ literal cho các kiểu dữ liệu vô hướng/nguyên thủy như số thực, số nguyên, chuỗi và Boolean. Tuy nhiên, JavaScript cũng chấp nhận literal cho các kiểu dữ liệu có cấu trúc như đối tượng và mảng. Do đó, có thể có một cú pháp ngắn gọn để khởi tạo theo yêu cầu các kiểu dữ liệu có cấu trúc nói trên.
Trong JavaScript, một literal array có thể chứa 0 hoặc nhiều biểu thức trong tuần tự khởi tạo và mỗi biểu thức là một phần tử của mảng. Các phần tử này được chứa trong dấu ngoặc vuông “[” và mỗi phần tử được phân tách bằng dấu phẩy. Việc khai báo mảng như vậy được gọi là ký hiệu bằng chữ. Để khai báo nó, bạn bắt đầu bằng cách chèn dấu ngoặc vuông mở đầu, thêm từng phần tử hoặc giá trị theo sau là dấu phẩy và kết thúc bằng dấu ngoặc vuông đóng.
Ví dụ tạo mảng JavaScript để biểu diễn 5 trái cây sử dụng literal anotation:
var fruits = ["orange","melon","Kiwi","Guava"];
Cách định nghĩa tương tự không sử dụng literal anotation:
var fruits = array();
fruits[0] = "orange";
fruits[1] = "melon";
fruits[2] = "Kiwi";
fruits[3] = "Guava";
JavaScript cho phép tạo đối tượng. Trong khi mảng là một chuỗi có thứ tự, một đối tượng đề cập đến một tập hợp không có thứ tự gồm 0 hoặc nhiều thành viên tồn tại dưới dạng cặp tên và giá trị. Ở đây, tên có dạng chuỗi, trong khi giá trị tương ứng có thể là Boolean, null, chuỗi, mảng, đối tượng hoặc số.
Tương tự như ký hiệu bằng chữ mảng, người ta có thể tạo các đối tượng bằng cách sử dụng ký hiệu bằng chữ. Ký hiệu chữ đối tượng cho phép tạo đối tượng bằng cách xác định các thành viên của nó. Danh sách các thành viên, dưới dạng cặp tên và giá trị, được bao gồm trong dấu ngoặc nhọn “{}” và mỗi cặp được theo sau bởi dấu phẩy. Tuy nhiên, trong mỗi thành viên, tên được phân tách khỏi giá trị bằng dấu hai chấm (:).
Ví dụ khởi tạo một đối tượng có ba thành phần là Street, City và PostalCode:
var Address = {
"street": "123 New Mansion Street",
"city": "Denver",
"PostalCode": 80123
};
alert("The product will be sent to postal code " + Address.PostalCode);
Đoạn mã trên cho thấy cho thấy việc sử dụng các ký tự dạng số và chuỗi trong các ký tự đối tượng và mảng. Tuy nhiên, bạn thậm chí có thể biểu diễn toàn bộ lưới bằng cách sử dụng ký hiệu đệ quy. Điều này có nghĩa là các giá trị và phần tử thành viên có thể có các ký tự đối tượng và mảng.
Đoạn mã dưới một đối tượng có tên là contact có một mảng có tên là ContactNumbers làm thành viên. Mảng này có một danh sách các đối tượng:
var contact = {
"Name": "John Doe",
"permitToCall": true,
"contactNumbers": [
{
"Place": "Home",
"Number": "445-563-3456"
},
{
"Place": "Work",
"Number": "445-563-7777 Ext.244"
}
]
};
if (contact.permitToCall) {
alert("Call " + contact.Name + " at " + contact.contactNumbers[0].Number);
}
Chuyển đổi Văn bản Ký hiệu (Literal Notation) sang JSON
JSON thực sự được tạo từ một phần của ký hiệu chữ đối tượng trong JavaScript. Mặc dù cú pháp cho các giá trị bằng chữ trong JavaScript rất linh hoạt nhưng JSON tuân theo các quy tắc chặt chẽ hơn. Tiêu chuẩn JSON bắt buộc tên thành viên đối tượng phải là một chuỗi JSON hợp lệ được đặt trong dấu ngoặc kép. Mặt khác, JavaScript cho phép phân tách tên thành viên đối tượng bằng dấu nháy đơn hoặc dấu ngoặc kép. Nó cũng cho phép bỏ qua trích dẫn hoàn toàn, cho đến khi tên không giống với bất kỳ từ khóa dành riêng nào.
Tương tự, giá trị thành viên hoặc phần tử mảng trong JSON bị giới hạn trong một tập hợp hạn chế. Tuy nhiên, trong JavaScript, cả hai có thể đề cập đến bất kỳ biểu thức hợp lệ nào, bao gồm cả định nghĩa và lệnh gọi hàm. Bất chấp những hạn chế này, tính đơn giản của JSON chính là điểm hấp dẫn.
Khi được định dạng theo tiêu chuẩn JSON, thông báo sẽ chứa mảng hoặc đối tượng cấp cao nhất. Các phần tử của mảng đó hoặc các giá trị của các thành viên đối tượng đó có thể là null, Boolean, số, chuỗi, mảng hoặc đối tượng. Literal Datetime không được JSON hỗ trợ. Lý do là vì chữ cũng không có trong JavaScript, trong đó giá trị ngày và giờ được lưu trữ thông qua đối tượng Date.
Là một giải pháp cho JSON, nhiều ứng dụng sử dụng kiểu dữ liệu số hoặc chuỗi để chỉ định giá trị ngày và giờ. Chuỗi này thường ở định dạng ISO 8601. Nếu loại dữ liệu là số thì giá trị được biểu thị bằng mili giây trôi qua kể từ nửa đêm ngày 1 tháng 1 năm 1970 theo Giờ Phối hợp Quốc tế (UTC). Đây chỉ là một quy ước; nó không thuộc tiêu chuẩn JSON.
Để trao đổi dữ liệu, điều cần thiết là phải xem tài liệu về ứng dụng nhận để biết cách các giá trị ngày và giờ được mã hóa theo dạng chữ JSON. Ví dụ: trong AJAX, chuỗi JSON được sử dụng để biểu thị giá trị DateTime.
Ví dụ tạo một tệp JSON
Người ta đã tuyên bố rằng JSON được phát triển từ JavaScript và tương thích với mọi ngôn ngữ hướng đối tượng.
Đoạn mã dưới minh họa một tệp JSON được lưu trữ với phần mở rộng json, cho thấy cách một đối tượng JavaScript được chuyển đổi thành chuỗi JSON.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
// Step 1: Defining a JavaScript Object
var jsonObject = {
"Name": "James Samuel",
"address": "1960 W CHELSEA AVE STE",
"city": "ALLENTOWN PA",
"postalcode": "18112"
};
// Step 2: Fetching JavaScript elements
document.write("<hr>");
document.write("<h2><font style=\"color: blue\">Name:</font> " + jsonObject.Name + "</h2>");
document.write("<hr>");
document.write("<h2><font style=\"color: blue\">Address:</font> " + jsonObject.address + "</h2>");
document.write("<hr>");
document.write("<h2><font style=\"color: blue\">City:</font> " + jsonObject.city + "</h2>");
document.write("<hr>");
document.write("<h2><font style=\"color: blue\">Postal Code:</font> " + jsonObject.postalcode + "</h2>");
document.write("<hr>");
// Step 3: Converting a JavaScript object to JSON
document.write("<h2><font style=\"color: blue\">Json Format:</font> " + JSON.stringify(jsonObject) + "</h2>");
document.write("<hr>");
</script>
</head>
<body>
</body>
</html>
Cú pháp javascript chuyển đổi từ đối tượng thành chuỗi định dạng JSON
JSON.stringify(value[, replacer[, space]]);
Trong đó:
value: xác định một giá trị JavaScript, thường là một đối tượng hoặc mảng cần chuyển đổi và là tham số bắt buộc.
replacer: đại diện cho một hàm hoặc mảng biến đổi kết quả và là tùy chọn.
space: thêm thụt lề, ngắt dòng và ký tự khoảng trắng vào chuỗi JSON được trả về để dễ đọc hơn và là tùy chọn.
Tham số replacer
Nếu giá trị của tham số replacer là một hàm thì nó sẽ được gọi và khóa cũng như giá trị của mỗi thành viên sẽ được truyền cho hàm đó. Giá trị trả về được tối ưu hóa thay vì giá trị ban đầu. Nếu hàm được gọi trả về undefined, mã sẽ loại trừ thành viên đó. Một chuỗi rỗng, được biểu thị là “” đóng vai trò là khóa của đối tượng gốc.
Nếu giá trị của replacer là một mảng thì mã chỉ chuyển đổi các thành viên có giá trị khóa thành chuỗi JSON. Trình tự mà các thành viên này trải qua quá trình chuyển đổi giống với trình tự của các Khóa trong mảng. Nếu đối số giá trị là một mảng thì mảng replacer sẽ bị bỏ qua.
Tham số space
Tham số space có thể là số hoặc chuỗi. Bạn thậm chí có thể hoàn toàn bỏ qua nó. Sau đây là mô tả điều gì sẽ xảy ra khi tham số nhận những giá trị này:
Nếu tham số space bị bỏ qua, chuỗi JSON xuất ra sẽ không có khoảng trắng bổ sung.
Nếu tham số space là một số, nó cho biết số lượng khoảng trắng được chèn ở mỗi cấp độ trong chuỗi JSON. Nếu giá trị đầu vào lớn hơn 10 thì chuỗi JSON vẫn thụt vào 10 khoảng trắng. Không có khoảng trắng được sử dụng nếu giá trị dưới 1.
Nếu tham số space là một chuỗi không trống, chẳng hạn như “\t”, điều đó có nghĩa là chèn khoảng trắng vào chuỗi JSON sau nhiều ký tự đó ở mỗi cấp độ. Nếu chuỗi đầu vào này nhiều hơn 10 ký tự thì việc thụt lề sẽ xảy ra bằng cách sử dụng 10 ký tự đầu tiên.