10/10/2018, 10:50
JSON, bạn đã biết gì ?
JSON hay còn gọi là JavaScript Object Notation, là một chuẩn dùng để truyền tải dữ liệu. Vậy hóa ra JSON chả làm được gì rồi, đúng vậy, thực tế thì anh JSON này chả có chút "võ công" gì cả, thế mà "giang hồ" lại đồn đại là anh này "mạnh lắm", làm được "nhiều thứ" lắm thì không chính xác "lắm". JSON là một dạng văn bản thuần, mô tả về một loại thông tin nào đó mà "con người" có thể đọc được(human-readability, còn con khác thì không đọc được nhá).
[HR]
JSON cũng như XML, nó chỉ mô tả dữ liệu, không có khả năng trình bày, không có khả năng "chạy", nói chung là thụ động. Ta chỉ có thể nhận JSON rồi làm gì đó, hoặc ta có gì đó rồi chuyển thành JSON để gửi đi, chứ ta không thể "chạy" JSON. Để hiểu rõ hơn ta "mần" một ví dụ:
{
giaDinhChuChin: [
{ lam: "Cha", ten: "Chín", tuoi: 50, nam: true, nhomMau: "O" },
{ lam: "Mẹ", ten: "Tái", tuoi: 49, nam: false, nhomMau: "A" },
{ lam: "Con", ten: "Tèo", tuoi: 15, nam: true, nhomMau: "AB" },
{ lam: "Con", ten: "Tủm", tuoi: 14, nam: false, nhomMau: "O" }
],
giaDinhChuMuoi: [
{ lam: "Độc thân vui tính", ten: "Mười", tuoi: 35, nam: true, nhomMau: "B" }
]
}
Trên đây ta có một ví dụ nhỏ, mô tả thông tin về 2 gia đình, trong gia đình có những thông tin thành viên như: cha, mẹ, con. Những thông tin trên được diễn đạt bằng những kiểu dữ liệu cơ bản của Javascript: chuỗi, số, mảng, đối tượng. Vậy JSON là một kiểu mô tả dữ liệu dựa trên cơ sở là Javascript. Tất nhiên dựa trên cơ sở thì không có nghĩa là giống hoàn toàn. JSON có những cú pháp và quy định riêng của nó:
Kiểu dữ liệu
Có 5 kiểu dữ liệu chính
Number (kiểu số bao gồm số nguyên và số thực)
String (kiểu chuỗi, nội dung bao bởi cặp dấu nháy kép ", những ký tự đặt biệt được escape bởi dấu ). Chú ý là theo chuẩn JSON thì không sử dụng dấu nháy đơn như Javascript để bọc chuỗi.
Boolean (kiểu luận lý bao gồm đúng true và sai false)
Array (kiểu mảng, gồm các phần tử phân cách nhau bởi dấu phẩy và mảng được bao bởi cặp dấu [ và ])
Object (kiểu đối tượng, gồm những cặp giá trị đi cùng nhau, mỗi cặp phân cách bởi dấu phẩy, đối tượng được bao bởi cặp dấu { và }, cặp giá trị bao gồm tên và giá trị được phân cách bởi dấu hai chấm
null (kiểu null, không có gì cả)
Phân tích ví dụ trên các bạn có thể thấy
tuoi [/URL]có kiểu dữ liệu là Number
ten [/URL]có kiểu dữ liệu là String
nam [/URL]là chỉ định giới tính nam, có kiểu dữ liệu là Boolean
giaDinhChuChin [/URL]và giaDinhChuMuoi [/URL]có kiểu dữ liệu là Array
{ lam: "Độc thân vui tính", ten: "Mười", tuoi: 35, nam: true, nhomMau: "B" }[/URL] mỗi thành viên là một kiểu đối tượng
lam: "Độc thân vui tính"[/URL] là một cặp giá trị của một đối tượng, lam là tên thuộc tính đối tượng, "Độc thân vui tính" là giá trị của thuộc tính đó
Nhìn tổng thể thì giaDinhChuChin: [...][/URL] và giaDinhChuMuoi: [...][/URL] cũng là một cặp giá trị
Qua ví dụ, bạn đã hình dung cách biểu diễn các giá trị trong JSON, bạn có thể tham khảo thêm tại Wiki và json.org.
Nhưng có một điểm, bạn sẽ thắc mắc là, tại sao không có kiểu dữ liệu ngày tháng, trong khi ngày tháng lại được sử dụng khá nhiều và Javascript có trang bị kiểu dữ liệu ngày tháng nhưng sao JSON lại không ?
Trình bày kiểu ngày tháng
Trước hết mình xin giải thích, do JSON là một chuẩn chung có nghĩa là không phụ thuộc nền tảng hay công nghệ, chính vì vậy đó là điểm "khó xử" cho JSON. JSON không thể định ra rằng một kiểu thời gian thì phải ra sao, do mỗi ngôn ngữ lập trình, mỗi nền tảng triển khai có sự quy định về Date khác nhau, đơn cử như Javascript lưu trữ kiểu Date chỉ từ 1-1-1970 trở đi (giới hạn trên mình không nêu ra) hoặc như PHP thì chả có kiểu dữ liệu Date, Date chỉ là một con số chỉ ra số millisecond tính từ 1-1-1970 (với phiên bản 5.1.0 thì từ 13-12-1901), còn anh .NET thì có giới hạn ngày gần như rộng nhất. Do vậy, mỗi nhà mỗi cảnh, không thể quy định được, chính vì không thể quy định được nên cách gửi / nhận Date bằng JSON cũng khác nhau
Mình xin đơn cử 2 công nghệ chính là PHP và .NET
Xem đầy đủ tại http://linq2js.blogspot.com/2010/10/...n-la-json.html
[HR]
JSON cũng như XML, nó chỉ mô tả dữ liệu, không có khả năng trình bày, không có khả năng "chạy", nói chung là thụ động. Ta chỉ có thể nhận JSON rồi làm gì đó, hoặc ta có gì đó rồi chuyển thành JSON để gửi đi, chứ ta không thể "chạy" JSON. Để hiểu rõ hơn ta "mần" một ví dụ:
{
giaDinhChuChin: [
{ lam: "Cha", ten: "Chín", tuoi: 50, nam: true, nhomMau: "O" },
{ lam: "Mẹ", ten: "Tái", tuoi: 49, nam: false, nhomMau: "A" },
{ lam: "Con", ten: "Tèo", tuoi: 15, nam: true, nhomMau: "AB" },
{ lam: "Con", ten: "Tủm", tuoi: 14, nam: false, nhomMau: "O" }
],
giaDinhChuMuoi: [
{ lam: "Độc thân vui tính", ten: "Mười", tuoi: 35, nam: true, nhomMau: "B" }
]
}
Trên đây ta có một ví dụ nhỏ, mô tả thông tin về 2 gia đình, trong gia đình có những thông tin thành viên như: cha, mẹ, con. Những thông tin trên được diễn đạt bằng những kiểu dữ liệu cơ bản của Javascript: chuỗi, số, mảng, đối tượng. Vậy JSON là một kiểu mô tả dữ liệu dựa trên cơ sở là Javascript. Tất nhiên dựa trên cơ sở thì không có nghĩa là giống hoàn toàn. JSON có những cú pháp và quy định riêng của nó:
Kiểu dữ liệu
Có 5 kiểu dữ liệu chính
Number (kiểu số bao gồm số nguyên và số thực)
String (kiểu chuỗi, nội dung bao bởi cặp dấu nháy kép ", những ký tự đặt biệt được escape bởi dấu ). Chú ý là theo chuẩn JSON thì không sử dụng dấu nháy đơn như Javascript để bọc chuỗi.
Boolean (kiểu luận lý bao gồm đúng true và sai false)
Array (kiểu mảng, gồm các phần tử phân cách nhau bởi dấu phẩy và mảng được bao bởi cặp dấu [ và ])
Object (kiểu đối tượng, gồm những cặp giá trị đi cùng nhau, mỗi cặp phân cách bởi dấu phẩy, đối tượng được bao bởi cặp dấu { và }, cặp giá trị bao gồm tên và giá trị được phân cách bởi dấu hai chấm
null (kiểu null, không có gì cả)
Phân tích ví dụ trên các bạn có thể thấy
tuoi [/URL]có kiểu dữ liệu là Number
ten [/URL]có kiểu dữ liệu là String
nam [/URL]là chỉ định giới tính nam, có kiểu dữ liệu là Boolean
giaDinhChuChin [/URL]và giaDinhChuMuoi [/URL]có kiểu dữ liệu là Array
{ lam: "Độc thân vui tính", ten: "Mười", tuoi: 35, nam: true, nhomMau: "B" }[/URL] mỗi thành viên là một kiểu đối tượng
lam: "Độc thân vui tính"[/URL] là một cặp giá trị của một đối tượng, lam là tên thuộc tính đối tượng, "Độc thân vui tính" là giá trị của thuộc tính đó
Nhìn tổng thể thì giaDinhChuChin: [...][/URL] và giaDinhChuMuoi: [...][/URL] cũng là một cặp giá trị
Qua ví dụ, bạn đã hình dung cách biểu diễn các giá trị trong JSON, bạn có thể tham khảo thêm tại Wiki và json.org.
Nhưng có một điểm, bạn sẽ thắc mắc là, tại sao không có kiểu dữ liệu ngày tháng, trong khi ngày tháng lại được sử dụng khá nhiều và Javascript có trang bị kiểu dữ liệu ngày tháng nhưng sao JSON lại không ?
Trình bày kiểu ngày tháng
Trước hết mình xin giải thích, do JSON là một chuẩn chung có nghĩa là không phụ thuộc nền tảng hay công nghệ, chính vì vậy đó là điểm "khó xử" cho JSON. JSON không thể định ra rằng một kiểu thời gian thì phải ra sao, do mỗi ngôn ngữ lập trình, mỗi nền tảng triển khai có sự quy định về Date khác nhau, đơn cử như Javascript lưu trữ kiểu Date chỉ từ 1-1-1970 trở đi (giới hạn trên mình không nêu ra) hoặc như PHP thì chả có kiểu dữ liệu Date, Date chỉ là một con số chỉ ra số millisecond tính từ 1-1-1970 (với phiên bản 5.1.0 thì từ 13-12-1901), còn anh .NET thì có giới hạn ngày gần như rộng nhất. Do vậy, mỗi nhà mỗi cảnh, không thể quy định được, chính vì không thể quy định được nên cách gửi / nhận Date bằng JSON cũng khác nhau
Mình xin đơn cử 2 công nghệ chính là PHP và .NET
Xem đầy đủ tại http://linq2js.blogspot.com/2010/10/...n-la-json.html
Bài liên quan
http://services.fsviet.com/bankservices/
Với những ứng dụng AJAX lấy và xử lý dữ liệu từ 1 web service nào đó khác domain. Nếu nội dung trả về có dạng XML thì javascript từ trang web của chúng ta không thể trực tiếp truy cập mà phải nhờ 1 proxy để đáp ứng yêu cầu của same origin policy. Còn nếu là dạng JSON thì không có vấn đề gì cả. (Thường dùng 1 lệnh eval là đủ.)
Tuy nhiên, với phác thảo về Cross-Origin Resource Sharing của W3C, có thể điều hạn chế nói trên của XML sẽ không còn nữa trong tương lai.