یک کتابخانه سریع و انعطافپذیر json برای جاوا
با فرمت فشرده و قالب “کلید، مقدار” json حتما آشنایی دارید. این فرمت اغلب در کنار xml معرفی و مقایسه میشود که در این مطلب قبلا به آن پرداختیم. اما از بین چندین کتابخانه json برای جاوا کدامیک واقعا بهتر است؟
نمودار زیر عملکرد پنج کتابخانه مختلف در کار با 1kb فایل JSON را مشاهده میکنید.
همانطور که مشاهده میشود 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 میتوانید ارسال کنید.
منبع:
خیلی ممنون این کتابخونه بدردم میخوره