دانستنی‌ها

یک کتابخانه سریع و انعطاف‌پذیر json برای جاوا

با فرمت فشرده و قالب “کلید، مقدار” json حتما آشنایی دارید. این فرمت اغلب در کنار xml معرفی و مقایسه می‌شود که در این مطلب قبلا به آن پرداختیم. اما از بین چندین کتابخانه json برای جاوا کدامیک واقعا بهتر است؟

نمودار زیر عملکرد پنج کتابخانه مختلف در کار با 1kb فایل JSON را مشاهده می‌کنید.

java-json-jsoniter

همانطور که مشاهده می‌شود jsoniter از کتابخانه‌های موجود بسیار سریع‌تر است.

مزایای jsoniter از این نوآوری‌ها می‌آید:

۱ Any Type: این کتابخانه بایت‌های خام را به عنوان نوع Any دریافت می‌کند. پردازش آن به شکل lazy انجام می‌شود. Any می‌تواند مشابه آرایه PHP یا اشیا جاوااسکریپت استفاده شود و weakly typed است.

۲ Iterator Abstraction: ورودی‌های JSON را به صورت اشیا iterator مانند در نظر می‌گیرد. شما می‌توانید روی گراف پیمایش کنید. مشابه gson اما بسیار ساده‌تر از آن.

۳ Trie-Tree: بزرگترین مشکل JSON  فیلدهای رشته‌ای آن است که مقایسه رشته‌ها زمان زیادی می‌برد. jsoniter برای افزایش سرعت از tri-tree استفاده می‌کند.

۴ code generation: تمام منطق decoder/encoder می‌تواند تولید کد شود. گزینه های مختلفی هم مثل reflection/dynamic codegen/static codegen در دسترس است.

۵ تنها برای ویژگی‌ که می‌خواهید هزینه کنید: ورودی به شکل InputStream کندتر از byte[] است. پارسرهای قدیمی از یک تابع مجازی یا پرچم‌های ویژگی استفاده می‌کردند که کارایی را به شدت پایین می‌آورد. Jsoniter از dynamic class shadowing استفاده کرده تا پیاده‌سازی‌ها را سوئیچ کند.

۶ اعتبارسنجی مورد نیاز فیلدها: مربوط به زمانی است که یک شی از فیلد int را پردازش می‌کنید.Jsoniter  با bit mask فیلدها سر وکار دارد.

حال یک مثال می‌بینیم.

[1024, {"product_id": 100, "start": "beijing"}]
["1025", {"product_id": 101, "start": "shanghai"}]
// many many more lines

هر خط یک شی است. اولین المان شناسه سفارش است و دومی جزئیات آن است. توجه کنید که:

خطوط زیادی وجود دارد و خواندن همه آن‌ها مشکلات حافظه ایجاد می‌کند.

شناسه بعضی سفارش‌ها عددی و بعضی رشته است.

جزئیات سفارش‌ها فیلدهای زیادی دارد و نیاز است که به یک شی متصل شود.

 در ۶ خط همه این مشکلات را حل می‌کنیم:

JsonIterator iter = JsonIterator.parse(input); // input stream
OrderDetails orderDetails = new OrderDetails(); // reused
while(iter.whatIsNext() != ValueType.INVALID) {
    Any order = iter.readAny(); // lazy
    int orderId = order.toInt(0); // weakly typed
    String start = order.get(1).bindTo(orderDetails).start; // data binding
}

این مثال یک نمونه از انعطاف پذیری است. ممکن است پیچیده به نظر برسد اما اگر واقعا نیاز داشته باشید بسیار کاراست. برای کارهای روزانه، فقط دو خط زیر را به خاطر داشته باشید

JsonIterator.deserialize("[1,2,3]"); // JSON => object
JsonStream.serialize(new int[]{1,2,3}) // object => JSON

این کتابخانه جدید است و گزارش خطاهای آن را به آدرس https://github.com/json-iterator/java می‌توانید ارسال کنید.

منبع:

https://dzone.com/

نوشته های مشابه

یک دیدگاه

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

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

دکمه بازگشت به بالا