مرتبة مؤسسة
في Java ، هناك العديد من libs حول JSON ، مثل Jackjson و Fastjson و GSON ، إلخ. لقد استخدمتها ، لكن لا يزال يبدو ثقيلًا جدًا بالنسبة للمبرمجين الذين يحتاجون فقط إلى جعل كائن Java يعيد سلسلة JSON. علاوة على ذلك ، بعض الوظائف قابلة للتخصيص للغاية. على سبيل المثال ، عندما تكون سمة كائن Java فارغة ، لن يتم إخراج هذه المكونات. لذلك ، عندما أقوم بتخطي كائن القائمة على الصفحة ، يتعين علي دائمًا الحكم على ما إذا كانت هذه السمة غير محددة ، مما يجعلني غير راضٍ للغاية. لذلك قررت قضاء بعض الوقت لدراسة ما يجري.
ولكن بعد إلقاء نظرة فاحصة على صباح ، وجدت أن كل من Fastjson و Gson قد كتبوا بطريقة معقدة للغاية ، ولم تكن هناك مستندات أو تعليقات ذات صلة ، لذلك استسلمت أخيرًا. لذلك وجدت حزمة Java بسيطة نسبيًا تُرجع JSON على www.json.com. يحتاج هذا lib فقط إلى 5 فصول Java لتشغيلها ، وهذا بالضبط ما أريده. تجدر الإشارة إلى أن jsonarray الرسمية لا يدعم التحويل المباشر ل javabeans. على سبيل المثال ، لا يمكن تحويل أشياء مثل القائمة <Sether>. يجب تحويلها إلى تنسيق مثل القائمة <map> للتحويل ، لذلك قمت بتعديله. تشمل الوثائق الرسمية:
اسمحوا لي أولاً أن أقدم الاستخدام الأساسي.
استخدم فئة JsonObject للتعامل مع كائنات Java الأساسية ، والاستخدام تقريبًا كما يلي:
public void testmap () {map <string ، Object> map = new HashMap <string ، Object> () ؛ map.put ("name" ، "qiu") ؛ map.put ("كلمة المرور" ، "123") ؛ map.put ("العنوان" ، "الصين") ؛ مستخدم المستخدم = مستخدم جديد () ؛ user.setUserName ("qiuqiu") ؛ user.setPassword ("123456") ؛ user.getTels (). add ("123444556677") ؛ user.getTels (). add ("6893493458585") ؛ map.put ("المستخدم" ، المستخدم) ؛ JSonObject JSON = New JSonObject (MAP) ؛ System.out.println (json.toString ()) ؛ } إذا كان كائن جمع ، يتم استخدام فئة Jsonarray ، والاستخدام كما يلي:
public void testlist () يلقي JSOnexception {list <served> list = new ArrayList <Sether> () ؛ مستخدم المستخدم = مستخدم جديد () ؛ user.setUserName ("qiuqiu") ؛ user.setPassword ("123456") ؛ user.getTels (). add ("123444556677") ؛ user.getTels (). add ("6893493458585") ؛ المستخدم المستخدم 2 = مستخدم جديد () ؛ user2.SetUserName ("الصين") ؛ user2.getTels (). ADD ("1234444556677") ؛ user2.getTels (). ADD ("6893493458585") ؛ list.add (user) ؛ list.add (user2) ؛ Jsonarray json = New Jsonarray (قائمة) ؛ System.out.println (Json.ToString (2)) ؛ } من الكود أعلاه ، يمكننا أن نرى أن استخدام هذا lib بسيط للغاية. لا يتطلب ذلك كائنًا جديدًا مثل GSON ، كما أن تصميم API الخاص بـ Fastjson غير معقول إلى حد ما. في الكود الثاني أعلاه ، هناك tostring (2) يشير إلى الإخراج عن طريق المسافة البادئة في مسافة اثنين في خط جديد.
ما سبق يقدم الاستخدام الأساسي فقط ، ولكن هذا ليس ما تريد. ما تريده هو كيفية إرجاع سلسلة فارغة عندما تكون خاصية الكائن فارغة ، بدلاً من إرجاع أي شيء. على الرغم من وجود 5 فصول فقط ، إلا أن الأمر استغرق مني ساعتين أو ثلاث ساعات للعثور على المكان. هناك طريقة تسمى populatemap في JsonObject ، وفي النهاية هناك قطعة صغيرة من الكود:
نتيجة الكائن = method.invoke (Bean ، (Object []) null) ؛ if (result! = null) {this.map.put (المفتاح ، التفاف (نتيجة)) ؛ }وهذا هو ، عندما يتم استدعاء طريقة GET وإعادتها كخلفية ، هذه الخاصية ليست إخراج. بالطبع ، من السهل جدًا التغيير:
نتيجة الكائن = method.invoke (Bean ، (Object []) null) ؛ this.map.put (المفتاح ، النتيجة == null؟ "": التفاف (نتيجة)) ؛
هذا أخيرًا حل المشكلة التي أردت حلها. بالطبع ، يتم إحضار هذا lib رسميًا بواسطة JSON وهو مكتوب ببساطة. إنه أكثر ملاءمة للمواقف التي لا يوجد فيها سوى عدد قليل من البيانات أو العشرات من البيانات في وقت واحد ، مثل عرض الصفحات. إذا كانت كمية البيانات المنقولة في وقت واحد كبيرًا نسبيًا ، فيمكنك التفكير في استخدام FastJson ، وما إلى ذلك ، لكنني شخصياً أعتقد أنه في معظم المناسبات ، فإن التخصيص الأكثر ضرورة هو. على سبيل المثال ، إذا وجدت أحيانًا مكونًا معينًا لا يمكنه تلبية الاحتياجات ، فلن يكون للمكون أي وثائق أو تعليقات ، ويصعب فهم الكود ، وهو ما هو نفس المصدر المفتوح ، بحيث لا يكون له معنى.
مثال ملخص
استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد javax.servlet.http.httpservletresponse ؛ استيراد com.alibaba.fastjson.json ؛ استيراد com.alibaba.fastjson.serializer.SerializerFeature ؛ / **** خادم الويب يعيد فئة أدوات JSON* تعتمد فئة الأدوات على FastJson* تدعم فئة الأدوات إرجاع بيانات تنسيق JSON و JSONP* Author accountwcx.com**/ public class reviewjsonutils {/ *** revault chargeing*/ private static encoding = "utf-8" ؛ / *** JSONP وظيفة رد الاتصال الافتراضي*/ سلسلة ثابتة callback = "Callback" ؛ /*** إعدادات تسلسل Fastjson*/private static serializerfeature [] ميزات = new SerializerFeature [] {// إخراج قيمة NUBR في map serializerfeature.writemapnullue ، serializerfeature.writenulllistasempty ، // إذا كان الرقم فارغًا ، فإن الإخراج هو 0 serializerfeature.writenullnumberaszero ، // الإخراج null string serializerfeature. / *** Serialize Java Object JSON* param obj java كائن يتطلب json serialization* @regurn json string*/ private static string tojsonstring (Object obj) {return json.tojsonstring (obj ، الميزات) ؛ }/*** إرجاع بيانات تنسيق JSON* param استجابة* param data كائن Java ليتم إرجاعه* param الترميز إرجاع تنسيق الترميز لسلسلة JSON*/public static void json (httpletresponse response ، charseDing ، charset) استجابة. setcharacterencoding (الترميز) ؛ printWriter Out = null ؛ جرب {out = reponse.getWriter () ؛ out.write (tojsonstring (data)) ؛ out.flush () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} / *** إرجاع بيانات تنسيق JSON ، باستخدام الترميز الافتراضي* @param response* param data object java ليتم إرجاعه* / public static void json (httpservletresponse response ، data data) {json (استجابة ، بيانات ، تشفير) ؛ } / *** إرجاع بيانات JSONP ، باستخدام وظائف الترميز الافتراضية والاستجابة الافتراضية* param استجابة* param data data* / public static void jsonp (httpservletresponse response ، data data) {jsonp (الاستجابة ، رد الفعل ، البيانات ، الترميز) ؛ } / *** إرجاع بيانات JSONP ، باستخدام الترميز الافتراضي* @param Response* param callback اسم وظيفة callback jsonp* param data data* / public static void jsonp (httpservletponse response ، callback string ، بيانات الكائن) {jsonp (استجابة ، callback ، البيانات ، تشفير) ؛ } / *** إرجاع بيانات JSONP* param استجابة* param callback اسم وظيفة callback jsonp اسم* param data data* @param ترميز بيانات JSONP* / public static void jsonp (httpservletresponse response ، compback string ، بيانات الكائن ، تشفير السلسلة) {StringBuffer SB = sb.append ("(" (") ؛ sb.append (tojsonstring (data)) ؛ sb.append (") ؛ ") ؛ // قم بتعيين استجابة تنسيق الترميز. استجابة. setcharacterencoding (الترميز) ؛ printWriter Out = null ؛ جرب {out = reponse.getWriter () ؛ out.write (sb.toString ()) ؛ out.flush () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} السلسلة الثابتة العامة getencoding () {return الترميز ؛ } setencoding public static void (ترميز السلسلة) {responsejsonutils.encoding = الترميز ؛ } السلسلة الثابتة العامة getCallback () {return callback ؛ } public static void setCallback (سلسلة callback) {responsejsonutils.callback = callback ؛ }} /*** إرجاع بيانات JSON في servlet* /webservlet ("/json.do") تمتد الفئة العامة jsonservlet httpservlet {private Static Final Long SerialVersionuid = 7500835936131982864L ؛ / *** إرجاع بيانات تنسيق JSON*/ خدمة void المحمية (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {map <string ، object> data = new hashmap <string ، object> () ؛ Data.put ("Date" ، New Date ()) ؛ Data.put ("البريد الإلكتروني" ، "[email protected]") ؛ Data.put ("العمر" ، 30) ؛ Data.put ("name" ، "CSDN") ؛ Data.put ("Array" ، new int [] {1،2،3،4}) ؛ ResponseJsonutils.json (الاستجابة ، البيانات) ؛ }} /*** Servlet يعيد بيانات تنسيق JSONP*/WEBServlet ("/jsonp.do") تمتد الفئة العامة jsonpservlet httpservlet {private Static Final Long SerialVersionuid = -834340864035108293L ؛ /*** سيرسل الطلب معلمة رد الاتصال كدالة رد اتصال. إذا لم يتم إرسال معلمة رد الاتصال ، فسيتم استخدام وظيفة رد الاتصال الافتراضية*/خدمة void المحمية (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {// وظيفة رد الاتصال المرسلة بواسطة سلسلة callback = request.getParameter ("Callback") ؛ خريطة <string ، Object> data = new HashMap <string ، Object> () ؛ Data.put ("Date" ، New Date ()) ؛ Data.put ("البريد الإلكتروني" ، "[email protected]") ؛ Data.put ("العمر" ، 30) ؛ Data.put ("name" ، "CSDN") ؛ Data.put ("Array" ، new int [] {1،2،3،4}) ؛ if (callback == null || callback.length () == 0) {// إذا لم يرسل العميل وظيفة رد الاتصال ، فاستخدم وظيفة رد الاتصال الافتراضية reviewjsonutils.jsonp (استجابة ، بيانات) ؛ } else {// استخدم وظيفة رد الاتصال الخاصة بالعميل ResponseJsonutils.jsonp (استجابة ، رد الاتصال ، البيانات) ؛ }}}} / ** * إرجاع JSON و JSONP في Struts2 */ JSONACTION Public يمتد ACTIONSUPORT {Private Static Final Long SerialVersionuid = 5391000845385666048L ؛ / *** JSONP وظيفة رد الاتصال*/ سلسلة الاتصال الخاصة ؛ / ** * return json */ public void json () {httpservletResponse respress = servleTactionContext.getResponse () ؛ خريطة <string ، Object> data = new HashMap <string ، Object> () ؛ Data.put ("Date" ، New Date ()) ؛ Data.put ("البريد الإلكتروني" ، "[email protected]") ؛ Data.put ("العمر" ، 30) ؛ Data.put ("name" ، "CSDN") ؛ Data.put ("Array" ، new int [] {1،2،3،4}) ؛ ResponseJsonutils.json (الاستجابة ، البيانات) ؛ } / ** * return jsonp * / public void jsonp () {httpservletresponse stripte = servleTactionContext.getResponse () ؛ خريطة <string ، Object> data = new HashMap <string ، Object> () ؛ Data.put ("Date" ، New Date ()) ؛ Data.put ("البريد الإلكتروني" ، "[email protected]") ؛ Data.put ("العمر" ، 30) ؛ Data.put ("name" ، "CSDN") ؛ Data.put ("Array" ، new int [] {1،2،3،4}) ؛ if (callback == null || callback.length () == 0) {// إذا لم يرسل العميل وظيفة رد الاتصال ، فاستخدم وظيفة رد الاتصال الافتراضية reviewjsonutils.jsonp (استجابة ، بيانات) ؛ } else {// استخدم وظيفة رد الاتصال الخاصة بالعميل ResponseJsonutils.jsonp (استجابة ، رد الاتصال ، البيانات) ؛ }} السلسلة العامة getCallback () {return callback ؛ } public void setCallback (سلسلة callback) {this.callback = callback ؛ }} استيراد org.springframework.steretype.controller ؛ استيراد org.springframework.web.bind.annotation.requestmapping ؛ /*** Spring MVC إرجاع بيانات JSON و JSONP*/controller @requestmapping ("/json") الفئة العامة jsoncontroller {/*** إرجاع بيانات JSON* request request* @param response*/ @ @requestmapping ("/json.do json json Data = new HashMap <string ، Object> () ؛ Data.put ("Date" ، New Date ()) ؛ Data.put ("البريد الإلكتروني" ، "[email protected]") ؛ Data.put ("العمر" ، 30) ؛ Data.put ("name" ، "CSDN") ؛ Data.put ("Array" ، new int [] {1،2،3،4}) ؛ ResponseJsonutils.json (الاستجابة ، البيانات) ؛ }/*** إرجاع بيانات JSONP* Param Callback JSONP وظيفة رد الاتصال* request* param Response*/ @REquestMapping ("/jsonp.do") public void json (String Callback ، httpservletrequest request ، httpservletsponse) Data.put ("Date" ، New Date ()) ؛ Data.put ("البريد الإلكتروني" ، "[email protected]") ؛ Data.put ("العمر" ، 30) ؛ Data.put ("name" ، "CSDN") ؛ Data.put ("Array" ، new int [] {1،2،3،4}) ؛ if (callback == null || callback.length () == 0) {// إذا لم يرسل العميل وظيفة رد الاتصال ، فاستخدم وظيفة رد الاتصال الافتراضية reviewjsonutils.jsonp (استجابة ، بيانات) ؛ } else {// استخدم وظيفة رد الاتصال الخاصة بالعميل ResponseJsonutils.jsonp (استجابة ، رد الاتصال ، البيانات) ؛ }}}