بسم الله الرحمن الرحيم
الحمد لله والصلاه والسلام على سيد الخلق أجمعين -صلى الله عليه وسلم-
السلام عليكم ورحمة الله وبركاتة
حديثنا اليوم عن تقنية JSON وهي إختصار لـ javaScript Object Notation وهي طريقة في لغة javaScript للتعامل مع البيانات , وتم إنتشارها ودعمها في أغلب لغات البرمجة الأخرى لسهولة وديناميكية التعامل مع هذه الطريقة ويمكن لنا إستخدام هذه الصيغة كبديل أمثل لنقل البيانات بدلاً من إستخدام ملفات XML .
وأيضاً إن كنت ممن يتعامل مع تطبيقات لها إتصال بخادم ستكون وسيلة جيدة لنقل البيانات بينهم وأيضاً تستخدم هذه التقنية في جلب البيانات من مواقع شهيرة كموقع twitter من خلالـ twitter json api وحالة الطقس من موقع yahoo من خلالـ yahoo json weather api
أولاً وقبل أن نخوض في التعامل مع تنسيق json من خلال لغة java علينا معرفة بنية هذا التنسيق لكيفية تحليل بياناته ومعرفة كيفية إستخدامه وإنشاء مكتباتك الخاصة للتعامل معه إن أردت ذلك ولكن هناك مكتبات كثيرة للتعامل مع هذا التنسيق في لغة java يمكنك إختيار ما تريد وستجدها على الموقع الرسمي لتنسيق json .
لكتابة تنسيق json علينا تضمينه ضمن علامتي أقواس معكوفة هكذا {} وداخل الأقواس يتم كتابة البيانات وبهذا نعرف كائن json
إذا أردنا تمثيل المتغيرات بتنسيق json يكون كالتالي
{"a":100}وهذا عبارة عن تمثيل عدد صحيح داخل المتغير a وإسناد القيمة من خلال الرمز : وليس رمز المساواة = ويفضل أن يتم وضع اسم المتغير بين علامتي إقتباس لأن بعض لغات البرمجة لا تقبل اسم المتغير إلا أن يكون داخل علامتي إقتباس
إذا أردنا تمثيل أكثر من متغير يتم الفصل بينهم بإستخدام الفاصلة , ولا يشترط الترتيب
{"a":100,"b":300,"c":400}ويمكن تمثيل بيانات مختلفة كالتالي
{"a":100,"b":122.016,"c":true,"d":"ahmed","e":null}من ملاحظتنا للمثال السابق أنه تم تمثيل أعداد صحيحة وأعداد كسرية وقيم منطقية وقيم فارغة وأيضاً نص مع ملاحظة أن النص يجب أن يكون بين علامتي إقتباس
إذا أردنا تمثيل مصفوفة فالأقواس المربعة [] تدل على أن القيم الموجودة بداخلها هي عبارة عن مصفوفة ويفصل بين قيمها بالفاصلة ,
[10,20,30]
والمصفوفة هنا يمكن أن تحتوي أي نوع من البيانات كـ أعداد صحيحة وكسرية وقيم منطقية وقيم نصية والقيمة الفارغة
[10,110.12,"ahmed",false,null]
وأيضاً يمكن تحتوي داخلها على مصفوفات وقيم مختلفة بين علامتي أقواس المجموعة {} كالتالي
[10,{"a":12,"b":"ahmed","c":null},12.12,[30,"ahmed","kamal"],"jamal"]وأيضاً العملية السابقة يمكن أن تتداخل وهكذا ...
بالنسبة للمصفوفات فالـkey أو الـindex للمصفوفة يمكن أن يكون نص بدلاً من الترتيب من 0 إلى أقل من عدد عناصر المصفوفة بمقدار 1 وهو ما يمكن عمله في لغة Java بـ HashMap أو hashTable ويكون تنسيقها بـ json كالتالي
["var1":10,"var2":20,"var3":30]
ويمكن أن تحتوي المتغيرات على مصفوفات بهذا الشكل
{"varArr1":["var1":10,"var2":20,"var3":30],"varArr2":["v1":12.00,"v2":30.00]}وما سبق هو عملية تمثيل البيانات بصيغة json والتالي كيفية تصدير وجلب البيانات منها من خلال مكتبة json-simple
وهذه هي المكتبة بصيغة jar
وهذه بصيغة zip
فبعد تنزيل المكتبة من أحد الروابط السابقة أو من موقع المكتبة على الرابط التالي , سنقوم بتضمينها داخل المشروع لإستخدامها .
أولاً: عملية تصدير البيانات إلى صيغة json :
سنقوم بتضمين JSONObject من المكتبة التي تم تضمينها كالتالي :
import org.json.simple.JSONObject;
والآن في الدالة الرئيسية سنقوم بإنشاء كائن من الـ JSONObject ونضع له القيم من خلال الدالة put ومن ثَم طباعته على الشاشة -أو حفظ الناتج في ملف- كالتالي :
public static void main(String[] args){
JSONObject obj=new JSONObject();
obj.put("a",100);
obj.put("b",20.095);
obj.put("c","ahmed");
obj.put("d", true);
obj.put("e",null);
System.out.println(obj);
}والخرج يكون كالتالي :
{"d":true,"e":null,"b":20.095,"c":"ahmed","a":100}وكما أشرت سابقاً أن الترتيب غير مهم -كما نعلم من خواص المجموعات-
وإذا أردنا دمج كائنين من صيغة JSONObject سنستخدم دالة putAll لدمج الكائن الأول في الثاني وهذا كالتالي :
public static void main(String[] args){
JSONObject obj=new JSONObject();
obj.put("a",100);
obj.put("b",20.095);
obj.put("c","ahmed");
obj.put("d", true);
obj.put("e",null);
JSONObject obj2=new JSONObject();
obj2.put("val1",200);
obj2.put("val2",12.10);
obj2.put("val3","jamal");
obj2.putAll(obj);
System.out.println(obj2);
}والمخرجات تكون على هذا النحو :
{"d":true,"e":null,"b":20.095,"c":"ahmed","a":100,"val3":"jamal","val1":200,"val2":12.1}وإذا أردنا إدخال مصفوفة يجب علينا تضمين الـJSONArray من المكتبة كالتالي :
import org.json.simple.JSONArray;
والآن نقوم بإنشاء كائن من الـJSONArray ونسند له القيم بإستخدام دالة add كالتالي :
public static void main(String[] args){
JSONArray arr = new JSONArray();
arr.add("ahmed");
arr.add(10);
arr.add(true);
System.out.println(arr);
}والمخرجات هي :
["ahmed",10,true]
ومن الكود السابق يتضح أن بإمكاننا تخزين قيم مختلفة داخل مصفوفة واحدة وهذا أمر جيد في حد ذاته لأنك تستطيع إستخدام هذه المصفوفة داخل برنامجك كما في الـhashMap أو الـhashTable كالتالي:
public static void main(String[] args){
JSONArray arr = new JSONArray();
arr.add("ahmed");
arr.add(10);
arr.add(true);
System.out.println(arr.get(0));
}ويمكنك التعرف على باقي الدوال بنفسك
ولم أجد في هذه المكتبة إمكانية التحويل المباشر من وإلى الصيغة التالية للمصفوفات المترابطة :
["key1":10,"key2":ahmed,"key3":false]
والآن إذا أردنا الدمج بين كائن من الـ JSONArray ضمن كائن الـJSONObject يكون الكود كالتالي :
public static void main(String[] args){
JSONArray arr = new JSONArray();
arr.add("Ahmed");
arr.add(10);
arr.add(true);
JSONObject obj = new JSONObject();
obj.put("val1", 300);
obj.put("val2", "yousef");
obj.put("arr1",arr);
System.out.println(obj);
}المخرجات :
{"val1":300,"arr1":["Ahmed",10,true],"val2":"yousef"}وإذا أردنا العكس يكون الكود كالتالي :
public static void main(String[] args){
JSONArray arr = new JSONArray();
arr.add("Ahmed");
arr.add(10);
arr.add(true);
JSONObject obj = new JSONObject();
obj.put("val1", 300);
obj.put("val2", "yousef");
arr.add(obj);
System.out.println(arr);
}والمخرجات :
["Ahmed",10,true,{"val1":300,"val2":"yousef"}]ويمكن إستخدام الـhashMap والـlinkedList للتحويل لتنسيق json كالتالي -لا ننسى تضمينهم- :
public static void main(String[] args){
JSONObject obj = new JSONObject();
HashMap hashM = new HashMap();
LinkedList link = new LinkedList();
hashM.put("val1",100);
hashM.put("val2","ahmed");
link.add(hashM);
link.add("yousef");
obj.put("arr",link);
System.out.println(obj);
}والمخرجات :
{"arr":[{"val1":100,"val2":"ahmed"},"yousef"]}ثانياً: مع إستيراد البيانات من صيغة الـjson :
علينا تضمين JSONValue لإستخدام كائن التحويل منها كالتالي :
import org.json.simple.JSONValue;
سنضع في متغير باسم inputs سلسة نصية بصيغة json مع تلاشي تضارب علامة الإقتباس المتتالية نضع الرمز \ -أو جلبها من ملف إن أردت- وننشئ كائن لنضع به المخرجات لنستطيع التعامل معها وتحويلها لكائن JSONObject أو كائن JSONArray
وهذا مثال :
public static void main(String[] args){
String inputs="{\"a\":10,\"b\":\"ahmed\",\"c\":true}";
Object obj = JSONValue.parse(inputs);
JSONObject jsonObj = new JSONObject();
jsonObj = (JSONObject)obj;
System.out.println(jsonObj.get("a"));
System.out.println(jsonObj.get("b"));
System.out.println(jsonObj.get("c"));
}المخرجات :
10 ahmed true
وهذا مثال آخر للتحويل للـJSONArray وإستخدامه كالتالي :
public static void main(String[] args){
String inputs="{\"a\":10,\"b\":[100,{\"val1\":\"mohammed\",\"val2\":20.12},200,\"kamal\"],\"c\":true}";
Object obj = JSONValue.parse(inputs);
JSONObject jsonObj = new JSONObject();
JSONObject jsonObj2 = new JSONObject();
JSONArray jsonArr = new JSONArray();
jsonObj = (JSONObject)obj;
jsonArr = (JSONArray)jsonObj.get("b");
jsonObj2 = (JSONObject)jsonArr.get(1);
System.out.println(jsonObj.get("a"));
System.out.println(jsonObj.get("c"));
System.out.println(jsonArr.get(0));
System.out.println(jsonArr.get(2));
System.out.println(jsonArr.get(3));
System.out.println(jsonObj2.get("val1"));
System.out.println(jsonObj2.get("val2"));
}والمخرجات :
10 true 100 200 kamal mohammed 20.12
- وداخل موقع مكتبة json-simple هناك أمثلة أخرى يمكنكم الإطلاع عليها .
دمتم في أمان الله
