ما می توانیم از هر دوی این تکنولوژی ها برای دریافت داده از سرور استفاده کنیم. در مثال زیر هم JSON و هم XML یک شیء به نام employees (به معنی «کارمند») می سازند که آرایه ای از 3 کارمند داشته باشد:
با استفاده از JSON
{"employees":[ { "firstName":"John", "lastName":"Doe" }, { "firstName":"Anna", "lastName":"Smith" }, { "firstName":"Peter", "lastName":"Jones" } ]}
با استفاده از XML
<employees> <employee> <firstName>John</firstName> <lastName>Doe</lastName> </employee> <employee> <firstName>Anna</firstName> <lastName>Smith</lastName> </employee> <employee> <firstName>Peter</firstName> <lastName>Jones</lastName> </employee> </employees>
JSON از نقطه نظرات زیر با XML شباهت دارد:
JSON از نقطه نظرات زیر با XML تفاوت دارد:
بنابراین می توان گفت JSON از XML بهتر است چرا که نوشتن XML بسیار سخت تر از JSON است. این برتری در برنامه های AJAX خودش را به خوبی نشان میدهد چرا که JSON بسیار سریع تر از XML عمل می کند. اگر قرار باشد از XML در برنامه های AJAX استفاده کنیم باید:
اما اگر از JSON استفاده کنیم باید:
XML قدیمی است و در زمان حاضر استفاده های خاص و محدودی دارد بنابراین بهتر است همیشه از JSON استفاده کنید.
در JSON مقادیر باید از انواع داده های زیر باشند:
مقادیر JSON اجازه ندارند که از نوع مقادیر زیر باشند:
رشته ها در JSON با double quote نوشته می شوند:
{ "name":"John" }
اعداد در JSON باید از نوع اعداد صحیح (integer) یا اعداد اعشاری (floating point) باشند:
{ "age":30 }
اشیاء میتوانند در رشته های JSON قرار بگیرند:
{ "employee":{ "name":"John", "age":30, "city":"New York" } }
این اشیاء که مقادیر JSON محسوب می شوند باید با قوانین JSON object (اشیاءِ JSON) منطبق باشند.
آرایه ها نیز اجازه دارند که در JSON قرار بگیرند:
{ "employees":[ "John", "Anna", "Peter" ] }
بولین ها مقادیری هستند که تنها دو مقدار true یا false را میگیرند و می توانند در رشته ی JSON نیز جا بگیرند:
{ "sale":true }
در آخر نیز مقدار مشهور null را خواهیم داشت:
{ "middlename":null }
یکی از رایج ترین استفاده های JSON، انتقال (دریافت و ارسال) اطلاعات به/از سرور است. وقتی داده را از سرور دریافت می کنیم آن داده همیشه رشته ای است بنابراین می توانیم از ()JSON.parse
استفاده کنیم تا به یک شیء جاوا اسکریپت تبدیل شود.
تصور کنید این رشته را از یک سرور دریافت کرده ایم:
'{ "name":"John", "age":30, "city":"New York"}'
می توانیم با استفاده از ()JSON.parse
آن را به یک شیء جاوا اسکریپت تبدیل کنیم:
var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');
به مثال زیر توجه کنید:
<!DOCTYPE html> <html> <body> <h2>Create Object from JSON String</h2> <p id="demo"></p> <script> var txt = '{"name":"John", "age":30, "city":"New York"}' var obj = JSON.parse(txt); document.getElementById("demo").innerHTML = obj.name + ", " + obj.age; </script> </body> </html>
شما می توانید با یک درخواست AJAX از سرور رشته ی JSON دریافت کنید و تا زمانی که پاسخ دریافتی از سمت سرور JSON باشد می توانید آن را در جاوا اسکریپت parse کنید:
<!DOCTYPE html> <html> <body> <h2>Use the XMLHttpRequest to get the content of a file.</h2> <p>The content is written in JSON format, and can easily be converted into a JavaScript object.</p> <p id="demo"></p> <script> var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var myObj = JSON.parse(this.responseText); document.getElementById("demo").innerHTML = myObj.name; } }; xmlhttp.open("GET", "json_demo.txt", true); xmlhttp.send(); </script> <p>Take a look at <a href="json_demo.txt" target="_blank">json_demo.txt</a></p> </body> </html>
نکته: اگر از دستور JSON.parse
روی JSON ای استفاده کنید که از یک آرایه آمده باشد، خروجی به جای یک شیء جاوا اسکریپتی یک آرایه خواهد بود:
<!DOCTYPE html> <html> <body> <h2>Content as Array.</h2> <p>Content written as an JSON array will be converted into a JavaScript array.</p> <p id="demo"></p> <script> var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var myArr = JSON.parse(this.responseText); document.getElementById("demo").innerHTML = myArr[0]; } }; xmlhttp.open("GET", "json_demo_array.txt", true); xmlhttp.send(); </script> <p>Take a look at <a href="json_demo_array.txt" target="_blank">json_demo_array.txt</a></p> </body> </html>
اشیاء تاریخ (date) در JSON غیر مجاز هستند بنابراین اگر نیاز به ارسال تاریخ یا دریافت آن دارد، آن را به صورت یک رشته بنویسید و بعدا به یک شیء تبدیلش کنید:
<!DOCTYPE html> <html> <body> <h2>Convert a string into a date object.</h2> <p id="demo"></p> <script> var text = '{"name":"John", "birth":"1986-12-14", "city":"New York"}'; var obj = JSON.parse(text); obj.birth = new Date(obj.birth); document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth; </script> </body> </html>
البته شما می توانید از پارامتر دوم دستور ()JSON.parse
نیز استفاده کنید. این پارامتر تابعی است که قبل از برگرداندن مقدار، تک تک خصوصیات را چک می کند:
<!DOCTYPE html> <html> <body> <h2>Convert a string into a date object.</h2> <p id="demo"></p> <script> var text = '{"name":"John", "birth":"1986-12-14", "city":"New York"}'; var obj = JSON.parse(text, function (key, value) { if (key == "birth") { return new Date(value); } else { return value; } }); document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth; </script> </body> </html>
همانطور که می دانید توابع نیز نمی توانند در JSON قرار بگیرند، بنابراین اگر نیاز به یک تابع دارید آن را به صورت رشته ای بنویسید. بعدا میتوانید آن را تبدیل به یک تابع کنید:
<!DOCTYPE html> <html> <body> <h2>Convert a string into a function.</h2> <p id="demo"></p> <script> var text = '{"name":"John", "age":"function() {return 30;}", "city":"New York"}'; var obj = JSON.parse(text); obj.age = eval("(" + obj.age + ")"); document.getElementById("demo").innerHTML = obj.name + ", " + obj.age(); </script> </body> </html>
البته این کار پیشنهاد نمی شود. سعی کنید هیچ گاه در JSON از توابع استفاده نکنید چرا که scope شان را از دست می دهند و باید از ()eval
برای برگرداندنشان به تابع استفاده کنید.
تمام مرورگر های امروزی از این دستور پشتیبانی می کنند:
برای مرورگرهای قدیمی تر کتابخانه ای در GitHub قرار داده شده است. می توانید به آن مراجعه کنید.
امیدوارم از این قسمت لذت برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.