چگونه با داده های Json در جاوا کار کنیم؟ امروزه به روش های مختلفی می توان داده ها را بین کامپیوتر های مختلف و حتی برنامه های مختلف انتقال داد. یکی از راه هایی که بیشترین استفاده را برای انتقال داده ها دارد انتقال داده ها بین کلاینت و سرور می باشد. به این صورت که داده هایی بر روی سرور ذخیره شده است. کلاینت برای این که این داده ها را به کاربر نشان دهد آنها را از سرور دریافت می کند یا حالتی دیگر آن است که کلاینت می خواهد داده هایی را در سرور ذخیره کند.
در دوره آموزش جاوا ( آموزش برنامه نویسی جاوا ) این موارد بصورت رایگان آموزش داده شده است
کلاینت می تواند یک اپ موبایل و یا یک وب سایت و یا یک برنامه ویندوزی باشد. برای این کار داده ها را به سرور می فرستد. شکل و فرمت داده هایی که بین سرور و کلاینت تبادل می شوند بسیار مهم است. چند فرمت استاندارد برای تبادل داده ها وجود دارد که از آنها بسیار استفاده می شود. معروف ترین این فرمت ها xml, json می باشد. در حال حاضر می توان گفت که json در حال محبوب تر شدن است.داده های json به شکل زیر می باشند.
[{"Id":25,"Name":"Hosein","Family":"Ahmadi"},{"Id":36,"Name":"Website","Family":"Itpro"},{"Id":42,"Name":"Mehdi","Family":"Adeli"}]
در این مطلب قصد داریم که بگوییم در زبان جاوا چگونه می توان داده های معمولی را به داده های json تبدیل کرد و چگونه داده های json را به داده های معمولی تبدیل نمود. برای این کار روش های مختلفی وجود دارد. به خاطر این که زبان جاوا یک زبان شی گرا می باشد پس داده ها نیز در قالب شی و کلاس در این زبان ذخیره می شود. بهترین روش این است که داده های json به طور مستقیم به اشیائ تبدیل شوند و برعکس اشیاء جاوا نیز به طور مستقیم به متن json تبدیل گردند. یکی از کتابخانه هایی که این کار را به نحو احسن انجام می دهد کتابخانه Jackson می باشد ما در این مطلب از این کتابخانه استفاده می کنیم که باید فایل jar آن را از این لینک دانلود کرده و به برنامه اضافه کنیم. بعد از این که این کتابخانه به برنامه اضافه شد نوبت به نوشتن کد می رسد. در ادامه بر روی مثالی کار می کنیم که نشان دهیم چگونه این عمل تبدیل انجام می شود.
ساخت پروژه و اقدامات اولیه
برای شروع کار یک پروژه ساده جاوا می سازیم که یک تابع main هم داشته باشد.همچنین ما برای این که یک مدل داده های داشته باشیم یک کلاس دیگر هم ایجاد می کنیم تا بتوانیم داده ها را در قالب این مدل تبدیل نماییم. این مدل به شکل زیر خواهد بود
static class Model{ public Model() { } public Model(int id, String name, String family) { Id = id; Name = name; Family = family; } public int Id; public String Name; public String Family; }
همانطور که می بینید در مدل بالا ما سه عدد فیلد داریم که آنها را می توانیم حتی از طریق constructor هم مقدار دهی نماییم.به خاطر این که می خواهیم از این مدل در داخل تابع main استفاده کنیم و تابع main هم از Static است پس این کلاس را هم استاتیک تعریف می کنیم.
تبدیل داده اصلی به داده json
برای این کار در تابع main چند شئ از کلاس گفته شده می سازیم و آن را با استفاده از تبدیل کننده به رشته json ذخیره می کنیم. مانند کد زیر
public static void main(String[] args){ ObjectMapper mapper=new ObjectMapper(); Model model=new Model(); model.Id=25; model.Family="Adeli"; model.Name="Mehid"; try { String value=mapper.writeValueAsString(model); System.out.println(value); } catch (IOException e) { e.printStackTrace(); }
در کد بالا از کلاس ObjectMapper یک شئ ساخته ایم. این شئ همه ی اعمال تبدیل به json و برعکس را می تواند انجام دهد. دقت داشته باشید که اگر کتابخانه Jackson را به برنامه اضافه نکرده باشید این شئ خطا خواهد داد. سپس یک شئ از کلاس Model که همان مدل داده ای ما است ساخته ایم و فیلد های آن را مقدار دهی کرده ایم. بعد از آن تنها کاری که کرده ایم این است که متد writeValueAsString را فراخوانی کرده ایم. این متد یک شئ را گرفته و تبدیل به داده json می کند و رشته را برمی گرداند که ما رشته را در یک متغیر به نام value ریخته ایم و آن را در خروجی نمایش می دهیم . خروجی برنامه بالا به شکل زیر خواهد بود
{"Id":25,"Name":"Mehid","Family":"Adeli"}
اگر بخواهید که خروجی json را در فایل ذخیره کنید می توانید از متد writeValue مربوط به mapper استفاده کنید. که شکل آن در زیر آورده شده است
mapper.writeValue(new File("c:\\file.json"), obj);
حال می توان این داده ها را در بستر اینترنت تبادل نمود
تبدیل داده های json به اشیاء جاوا
برای این که داده های که از سرور دریافت کرده ایم به فرمتی دربیاریم که بتوانیم در جاوا از آن استفاده کنیم باید اشیائی از داده های دریافتی بسازیم. برای این کار به شکل زیر عمل می کنیم.
public static void main(String[] args){ ObjectMapper mapper=new ObjectMapper(); try { String jsonValue="[{\"Id\":25,\"Name\":\"Mehdi\",\"Family\":\"Adeli\"},{\"Id\":36,\"Name\":\"Mohammad\",\"Family\":\"Nasiri\"},{\"Id\":42,\"Name\":\"Hosein\",\"Family\":\"Ahmadi\"}]"; ArrayList<Model> convertedList=mapper.readValue(jsonValue,new TypeReference<ArrayList<Model>>(){}); for (Model m : convertedList) { System.out.println(m.Name); } } catch (IOException e) { e.printStackTrace(); }
در این کد ما یک رشته به نام jsonValue داریم که داده های json را داخل آن ریخته ایم. برای این که داده های json را به شئ تبدیل کنیم از متد readValue استفاده می کنیم. در مثال بالا ما یک لیست از داد های مدل قبل داریم. متد readValue دارای دو ورودی است یکی داده json و دیگری کلاسی که باید مشخص کنیم که داده های json را به آن تبدیل کند.
برای مثال در کد بالا می خواهیم داده ها را به یک ArrayList از نوع Model تبدیل کنیم. دقت داشته باشید که برای داده هایی که لیستی و مجموعه ای هستند باید مثل شکل بالا کار کنیم ولی برای داده هایی که پیچیده نیستند مانند داده های یک کلاس به راحتی می توان از شکل ساده آن استفاده کرد یعنی فرض کنید که داده ما یک شئ از کلاس Model باشد در این صورت در ورودی دوم Model.class را می نویسیم. خروجی کد بالا به شکل زیر خواهد بود
Mehdi Mohammad Hosein
امیدوارم این مطلب برای شما مفید بوده باشد
سلام به شما دوست عزیز و ممنون از دقت نظر شما. بابت خطای به وجود اومده معذرت می خوام. کدی که فرموده بودین تصحیح شد.
با تشکر از شما.
با سلام به شما دوستان عزیز که زحمت مطالب رو میکشید تا بقیه دوستان استفاده کنن.
البته من در مقامی نیستم که بخواهم انتقاد کنم یا نظر خاصی بدم. ولی با داشتن محدود تجربه ای در این زمینه دوست دارم که با شما به اشتراک بزارم.
من چندین سایت آموزشی ایرانی رو مرور کردم و بعضا هم استفاده کردم ولی نقاط ضعفی ( با عرض پوزش) رو دیدم که در سایتهای خارجی خیلی کمتر دیده میشه و این نقاط ضعف باعث غیرقابل استفاده طولانی از محصولات و مطالب آموزشی سایتهای ایرانی میشه متاسفانه.
مثالی عرض میکنم:
چندی پیش دوستی از یه سایت ایرانی ویدیوی آموزشی رو به زحمت خریداری کرد( به دلیل اینکه در خارج از کشور است) با
مطالعه 5 قسمت در قسمت ششم مدرس تقریبا ایتمهای جدیدی رو به برنامه اضافه کرده بود که کارآموز باید میدانست که از متغیرها و موارد جدید چی هستند و از کجا آمده اند. هرچی تلاش کرد موفق به یافتن جواب خود نشد . به سایت فروشنده و به خود مدرس هم پیغام داد ولی هیچ جوابی نگرفت و نهایتا مجبور به کنار گذاشتن ویدیوی آموشی شد چون حدود 15 قسمت بود ولی چون تغییرات قسمت شش را متوجه نشده بود از مطالعه بعدیها منصرف شد.
واما موضوع شما نیز تا حدودی مشابه مشکل اون دوست ماست :)
در همین برنامه در این خط از برنامه , اشاره ای به لیست نشده فقط یهو اونو انتهای کد اضافه کرده اید. این موضوع باعث بدبینی کاربران میشه و متوجه میشوند که برنامه کپی پیست شده و به تغییرات توجهی نشده. من عذرخواهی میکنم و براتون آرزوی موفقیت میکنم. قربان شما . رضا