السلام عليكم و رحمه الله تعالى و بركاته
كما وضحت من قبل فى موضوع JSON ، ان النص JSON String الناتج من طلب السيرفر لابد من عمل eval له حتى ينتج عنه كائن object يمكننا الوصول إلى خواصه ، المشكله تكمن انه لو كان هذا ال JSON ناتج من مصدر غير موثوق منه او غير امن كما هو الحال فى جميع ال web services المتوافره ، يمكن ان يحتوى على self invoking anonymous function وظيفه مجهوله يتم تنفيذها تلقائيا يكون لها تحكم كامل فى الصفحه التى تستقبل هذا الرد من السيرفر ، يمكنها الوصول لل session cookie و الكتابه على الصفحه و تغير واجهه المستخدم و تنفيذ هجمات XSS و CSRF … الخ ، لذلك فإن خيار استخدام ال eval مع ال JSON String غير امن اطلاقا بالإضافه انه يؤثر على كفائه التطبيق لأن كل إستدعاء للوظيفه eval يؤدى إلى تشغيل مترجم الجافاسكربت من جديد .
لذلك دوجلاس كروكفورد مخترع ال JSON قام بكتابه parser يقوم بإعراب نصوص ال JSON و ينتج عنها Object صالح للإستعمال او ينتج عنه error فى حاله وجد function ، يحتوى كوده على وظيفتين تحت الكائن JSON ، الوظيفه الاول parse تحول ال string إلى Object ، و الوظيفه الثانيه stringify تقوم بتحويل أى Object إلى نص JSON ، و اعتمدت على هذا ال parser غالبيه التطبيقات التى تتعامل مع صيغه البيانات JSON لأنه عالج مشكله الامان ، لكن مازل يفتقد الكفائه و السرعه و من هنا بدأت الحاجه إلى JSON api من المتصفحات نفسها .
تم معايره ال JSON api فى EcmaScript 3.1 على نفس الاسس التى كتب عليها ال parser الذى طوره دوجلاس كروكفورد مخترع ال JSON .
أول متصفح بدأ بتقديم native JSON api هو متصفح الفايرفوكس و لكنه قصر إستخدامه على مطورين ال extentions ، و بعد ذلك تم تقديم ال JSON api لمطورين الصفحات فى النسخه 3.5 الذى خرج من البيتا من بضعه ايام ، IE8 ايضا يدعم JSON api منذ ال beta 2 .
يحتوى الكائن JSON على وظيفتين الاولى parse تقوم بتحويل النص إلى كائن كما يوضح المثال البسيط التالى :
var JSONString = '{"name":"Mostafa Farghaly","age":21,"language":"JavaScript"}';
var JSONObject = JSON.parse( JSONString );
/* JSONObject
{
name: "Mostafa Farghaly",
age:21,
language:"JavaScript"
}
*/
alert(JSONObject.name); //Mostafa Farghaly
alert(JSONObject.age); //22
alert(JSONObject.language); //JavaScript
الكود السابق قام بتحويل النص JSONString إلى كائن قابل للإستعمال JSONObject كما يوضح التعليق ، اما الوظيفه الثانيه Stringify فتقوم بتحويل الكائن إلى نص كما يوضح الكود البسيط التالى :
var JSONObject = {
"languages":[
"JavaScript",
"C++",
"Python",
"ruby"
]
};
var JSONString = JSON.stringify( JSONObject );
/* JSONString
'{"languages":["JavaScript","c++","python","ruby"]}'
*/
الكود السابق قام بتحويل الكائن JSON إلى النص JSONString يمكن إرساله إلى السيرفر او تخزينه فى قاعده البيانات كما تريد .
بالنسبه للمتصفحات التى لم تدعم native JSON api مثل opera و safari و المتصفحات القديمه يمكنك استخدام ال parser الذى برمجه douglas crockfrod مخترع ال JSON ، ستجده هنا ، و هو يحتوى على نفس الوظيفتين الى شرحتهم بالأعلى .
للمزيد :
Native JSON in IE8 مقال شامل أفضل من الموجود بموزيلا و يستفيض فى شرح parse و stringify
Using JSON in FireFox