خانه / دانستنی‌ها / معرفی مبدل های Json در جاوا

معرفی مبدل های Json در جاوا

در این مطلب به تعریف Json و موارد استفاده ی آن اشاره شده است همچنین توضیح داده شد که چگونه می توان یک آبجکت POJO را تبدیل به Json کرد ( serialize ) و چگونه Json را تبدیل به آبجکت کرد ( deserialize ). برای اینکار لایبری (‌کتابخانه ) های زیادی در جاوا وجود دارد که محبوب ترین آن ها Jackson و Gson , google simple json و org.json است . در این مطلب می خواهیم به معرفی یک Json Serializer جدید بنام  Axon بپردازیم.

Axon – Yet Another Json Serializer
ابتدا باید بگم Axon Json Serializer با Axon Framework متفاوت است ( خیلی ها این دو را اشتباه می کنند ) .  اکسون  یک مبدل از POJO به Json و برعکس Json به POJO است. در مثال زیر نحوه انجام اینکار نمایش داده شده است .

ولی چه نیازی بود تا با وجود پروژه هایی مثل Jackson یک مبدل دیگه تولید شود ؟

زمانیکه شما می خواهید یک آبجکت را serialize یا deserialize کنید ممکن است با مشکلاتی روبرو شوید مخصوصا زمانی که آبجکت شما entity model در Hibernate است . در ادامه به این مشکلات و نحوه رفع این مشکلات در پروژه اکسون می پردازیم .

۱- Serialize By Type
فرض کنید می خواهید بر اساس Data Type ( نوع داده ها ) عمل تبدیل به Json را انجام دهید . بعنوان مثال می خواهید تمام فیلدهای تاریخ بصورت epoch serialize شوند . ( بدون استفاده از annotation اضافی در مدل ). برای انجام اینکار هم می توانید از typeconverter های موجود در اکسون استفاده کنید و هم بصورت زیر می توانید یک typeconverter بنویسید

حال فقط کافیست تا با استفاده از AxonBuilder این typeconverter جدید را به اکسون معرفی کنید .

به این نوع ساخت آبجکت اصطلاحا method-chaining گفته می شود . این روش برنامه نویسی در زبان smalltalk زیاد استفاده می شود .

۲-Partial Update
فرض کنید Json ای که برای شما ارسال می شود فقط شامل مبلغ اعتبار کاربر است و بقیه مشخصه ها مانند نام و نام خانوادگی برای شما ارسال نمی شود بعلاوه برای کاهش حجم تبادل اطلاعات ، این یک روش رایج است که هر بار تمام مقادیری که تغییر نکرده برای شما ارسال نشود . در حالت معمول پس از serialize کردن ( تبدیل Json به آبجکت ) از آنجاییکه نام و نام خانوادگی در آبجکت null است پس از بروزرسانی مقدار null در پایگاه داده بروز می شود و این رفتاری که انتظارش را دارید نیست بلکه فقط باید مبلغ اعتبار کاربر بروز شود .

۳-Custom View

امکان ایجاد نما های سفارشی . بعنوان مثال فرض کنید وقتی لیست کاربران را برای ادمین serialize می کنید ایمیل کاربران را نمایش می دهید ولی وقتی که همین api را به شرکت های دیگری می دهید نیاز نیست تا ایمیل کاربران در خروجی Json باشد . یا حتی می خواهید view های خود را از فایل xml بسازید و در فایل xml تعیین کنید که چه فیلدهایی serialize شود. خیلی راحت می توانید اینکار را با Filter انجام دهید .

 

۴-lightweigth
لایبرری Gson تقریبا ۲۰۰ کیلوبایت است یعنی به اندازه ی Plexus IOC Container . اکسون فقط ۳۰ کیلو بایت است .

۵-جلوگیری از حلقه بینهایت ( Recursion Control )

فرض کنید مدلی دارید که یک فیلد از نوع خودش را دارد. در طراحی های مدل های هایبرنیت این مسئله و روابط دوطرفه زیاد پیش می آید . اکسون بدون استفاده از هیچ annotation اضافی از افتادن در حلقه بینهایت  ( stackoverflowexception ) جلوگیری می کند .

برای درک بهتر این مشکل سعی کنید مدل زیر را با جکسون serialize کنید .

 

۶- Android support
پشتیبانی از اندروید . در برنامه های اندروید هم می توانید از اکسون استفاده کنید .

۷-small memory footprint high-performance
این مورد بیشتر جنبه ی تبلیغاتی داره ولی اکسون سرعت خیلی بالایی در serialize کردن لیست های طولانی داره و حاظه کمی مصرف می کنه . این قسمت بصورت تمرین به خواننده واگذار میشود .

۸- Lazyinitialize exception
در مدل های هایبرنیت همیشه روابط باید از نوع Lazy باشد (البته می توانید روابط را EAGER تعریف کنید اما اینکار توصیه نمی شود و عواقب اینکار به عهده خواننده است ، توضیح این عواقب از محدوده این مطلب خارج است) . زمانیکه آبجکتی با fetchtype lazy  را می خواهید تبدیل به Json کنید خطای LazyInitializeException می گیرید اکسون یک ماژول هایبرنیت دارد که با باز کردن یک session جدید آبجکت را با بدون خطا serialize می کند .

این مبدل Json بصورت رایگان و متن باز از اینجا قابل دانلود و استفاده است .

 


درباره امید پورهادی

همچنین بررسی کنید

ساخت یک پروژه ساده JavaFX با استفاده از NetBeans IDE 11 و JavaFX12

به نام خدا و با سلام به همگی خب اگر شما هم مثل من علاقه‌مند …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *