Kasur Yayasan
Di Java, ada banyak lib tentang JSON, seperti Jackjson, Fastjson, Gson, dll. Saya telah menggunakannya, tetapi tampaknya masih terlalu berat untuk pemrogram yang hanya perlu membuat objek Java mengembalikan string JSON. Selain itu, beberapa fungsi sangat dapat disesuaikan. Misalnya, ketika atribut objek Java kosong, komponen -komponen ini tidak akan menghasilkan. Oleh karena itu, ketika saya mengulangi objek daftar pada halaman, saya selalu harus menilai apakah atribut ini tidak ditentukan, yang membuat saya sangat tidak puas. Jadi saya memutuskan untuk meluangkan waktu untuk mempelajari apa yang sedang terjadi.
Tetapi setelah melihat dari dekat untuk pagi, saya menemukan bahwa Fastjson dan Gson ditulis dengan cara yang sangat rumit, dan tidak ada dokumen atau komentar yang relevan, jadi saya akhirnya menyerah. Jadi saya menemukan paket Java yang relatif sederhana yang mengembalikan JSON di www.json.com. Lib ini hanya membutuhkan 5 kelas Java untuk dijalankan, yang persis seperti yang saya inginkan. Perlu dicatat bahwa JsonArray resmi tidak mendukung konversi langsung JavaBeans. Misalnya, hal -hal seperti Daftar <User> tidak dapat dikonversi. Mereka harus dikonversi menjadi format seperti daftar <peta> untuk mengonversi, jadi saya memodifikasinya. Dokumen resmi meliputi:
Biarkan saya pertama kali memperkenalkan penggunaan dasar.
Gunakan kelas JSONObject untuk menangani objek Java dasar, dan penggunaannya secara kasar sebagai berikut:
public void testMap () {peta <string, object> peta = new HashMap <String, Object> (); peta.put ("name", "qiu"); peta.put ("kata sandi", "123"); peta.put ("alamat", "Cina"); Pengguna pengguna = pengguna baru (); user.setusername ("qiuqiu"); user.setPassword ("123456"); user.gettels (). add ("123444556677"); user.gettels (). add ("6893493458585"); peta.put ("pengguna", pengguna); JsonObject json = new jsonObject (peta); System.out.println (json.tostring ()); } Jika itu adalah objek koleksi, kelas JSONArray digunakan, dan penggunaannya adalah sebagai berikut:
public void testList () melempar jSonexception {list <user> list = new ArrayList <User> (); Pengguna pengguna = pengguna baru (); user.setusername ("qiuqiu"); user.setPassword ("123456"); user.gettels (). add ("123444556677"); user.gettels (). add ("6893493458585"); Pengguna pengguna2 = pengguna baru (); user2.setusername ("cina"); user2.gettels (). add ("1234444556677"); user2.gettels (). add ("6893493458585"); list.add (pengguna); list.add (user2); Jsonarray json = new jsonarray (daftar); System.out.println (json.tostring (2)); } Dari kode di atas, kita dapat melihat bahwa penggunaan lib ini cukup sederhana. Tidak memerlukan objek baru seperti GSON, dan desain API Fastjson juga agak tidak masuk akal. Dalam kode kedua di atas, ada tostring (2) yang menunjukkan output dengan mengindir dua ruang dalam baris baru.
Di atas hanya memperkenalkan penggunaan dasar, tetapi ini bukan yang Anda inginkan. Yang Anda inginkan adalah cara mengembalikan string kosong ketika properti objek kosong, daripada tidak mengembalikan apa pun. Meskipun hanya ada 5 kelas, saya butuh dua atau tiga jam untuk menemukan tempat itu. Ada metode yang disebut populatemap di jsonObject, dan pada akhirnya ada sepotong kecil kode:
Hasil objek = Method.invoke (bean, (objek []) null); if (result! = null) {this.map.put (tombol, wrap (hasil)); }Artinya, ketika metode GET dipanggil dan dikembalikan sebagai nol, properti ini bukan output. Tentu saja, sangat mudah untuk berubah:
Hasil objek = Method.invoke (bean, (objek []) null); this.map.put (kunci, hasil == null? "": wrap (hasil));
Ini akhirnya menyelesaikan masalah yang ingin saya selesaikan. Tentu saja, Lib ini secara resmi dibawa oleh JSON dan ditulis dengan sederhana. Lebih cocok untuk situasi di mana hanya ada beberapa atau puluhan data sekaligus, seperti tampilan pagination. Jika jumlah data yang ditransmisikan pada suatu waktu relatif besar, Anda dapat mempertimbangkan untuk menggunakan FastJson, dll. Tetapi saya pribadi berpikir bahwa untuk sebagian besar kesempatan, kustomisasi yang paling diperlukan adalah. Misalnya, jika Anda sesekali menemukan komponen tertentu yang tidak dapat memenuhi kebutuhan, komponen tidak memiliki dokumentasi atau komentar, dan kodenya sulit dipahami, yang pada dasarnya sama dengan tidak open source, sehingga tidak memiliki arti.
Contoh Ringkasan
impor java.io.ioException; impor java.io.printwriter; impor javax.servlet.http.httpservletResponse; impor com.alibaba.fastjson.json; impor com.alibaba.fastjson.serializer.serializerfeature; / **** Server Web Mengembalikan kelas alat JSON* Kelas alat tergantung pada fastjson* Kelas alat mendukung pengembalian data format JSON dan JSONP* @author [email protected]**/ Response Class PublicJSonUtils {/ *** Pengkodean Karakter Default*/ Private Static String Encoding = "UTF-8"; / *** JSONP Fungsi panggilan balik default*/ private static string callback = "callback"; /*** Pengaturan Serialisasi FastJson*/Private Static SerializerFeature [] fitur = serializerfeature baru [] {// output Nilai nol di peta serializerfeature.writemapnullValue, // jika objek boolean nol, output adalah serializerfeature.writenull -writenull, nol, nol, nol, output outpute. writenull -writenulcon. SerializerFeature.WritenulllistAsempty, // Jika nomornya nol, outputnya adalah 0 serializerfeature.writenullnumberaszero, // output null string serializerfeature.writenullStringAsempty, // format tanggal output serializerfeature.writenEcterform}; / *** Serialize objek java json* @param obj java objek yang membutuhkan serialisasi json* @return json string*/ private static string tojsonstring (objek obj) {return json.toJsonstring (obj, fitur); } /** * Return JSON format data* @param response * @param data Java object to be returned* @param encoding Return the encoding format of the JSON string*/ public static void json(HttpServletResponse response, Object data, String encoding){ //Set the encoding format response.setContentType("text/plain;charset=" + encoding); response.setcharacterencoding (pengkodean); Printwriter out = null; coba {out = response.getWriter (); out.write (tojsonstring (data)); out.flush (); } catch (ioException e) {e.printstacktrace (); }} / *** Mengembalikan data format JSON, menggunakan pengkodean default* @param response* @param data java objek untuk dikembalikan* / public static void json (httpservletResponse response, data objek) {json (respons, data, encoding); } / *** Mengembalikan data JSONP, menggunakan pengkodean default dan fungsi panggilan balik default* respons @param* @param data jsonp data* / public static void jsonp (httpservletResponse response, data objek) {jsonp (respons, callback, data, encoding); } / *** Mengembalikan data JSONP, menggunakan pengkodean default* @param response* @param callback jsonp nama fungsi panggilan balik* @param data jsonp data* / public static void jsonp (httpservletResponse response, string callback, objek data) {jsonp (respons, callback, data, encoding); } /** * Return JSONP data* @param response * @param callback JSONP callback function name* @param data JSONP data* @param encoding JSONP data*/ public static void jsonp(HttpServletResponse response, String callback, Object data, String encoding){ StringBuffer sb = new StringBuffer(callback); SB.Append ("("); SB.Append (TOJSonstring (Data)); SB.Append (");"); // Atur format pengkodean respons.setContentType ("Teks/polos; charset =" + encoding); response.setcharacterencoding (pengkodean); Printwriter out = null; coba {out = response.getWriter (); out.write (sb.tostring ()); out.flush (); } catch (ioException e) {e.printstacktrace (); }} public static string getEncoding () {return encoding; } public static void setencoding (string encoding) {responseJsonutils.encoding = encoding; } public static string getCallback () {return callback; } public static void setCallback (string callback) {responseJsonutils.callback = callback; }}
/*** Mengembalikan data JSON di servlet*/@webservlet ("/json.do") kelas publik JSonservlet memperluas httpservlet {private static final long serialversionuid = 7500835936131982864l; / *** Mengembalikan data format JSON*/ Layanan void yang dilindungi (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {peta <string, objek> data = hashmap baru <string, objek> (); Data.put ("Tanggal", Tanggal Baru ()); data.put ("email", "[email protected]"); data.put ("usia", 30); data.put ("name", "csdn"); data.put ("array", int baru [] {1,2,3,4}); ResponseJsonutils.json (respons, data); }} /*** Servlet Mengembalikan data format JSONP*/@webservlet ("/jsonp.do") kelas publik JSONPServlet memperluas httpservlet {private static final long serialversionuid = -8343408864035108293L; /*** Permintaan akan mengirim parameter panggilan balik sebagai fungsi panggilan balik. Jika parameter callback tidak dikirim, fungsi callback default akan digunakan*/Layanan void yang dilindungi (httpservletRequest, respons httpservletResponse) melempar servletException, ioException {// fungsi callback yang dikirim oleh string klien callback = request.getParameter ("callback"); Peta <String, Object> Data = HashMap baru <String, Object> (); Data.put ("Tanggal", Tanggal Baru ()); data.put ("email", "[email protected]"); data.put ("usia", 30); data.put ("name", "csdn"); data.put ("array", int baru [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// Jika klien tidak mengirim fungsi callback, gunakan fungsi callback default responseJsonutils.jsonp (respons, data); } else {// Gunakan fungsi panggilan balik klien responseJsonutils.jsonp (respons, callback, data); }}}} / ** * return json dan jsonp di struts2 */ kelas publik jsonAction memperluas ActionSupport {private static final long serialversionuid = 5391000845385666048l; / *** Fungsi panggilan balik JSONP*/ Private String Callback; / ** * return json */ public void json () {httpservletResponse response = servletActionContext.getResponse (); Peta <String, Object> Data = HashMap baru <String, Object> (); Data.put ("Tanggal", Tanggal Baru ()); data.put ("email", "[email protected]"); data.put ("usia", 30); data.put ("name", "csdn"); data.put ("array", int baru [] {1,2,3,4}); ResponseJsonutils.json (respons, data); } / ** * return jsonp * / public void jsonp () {httpservletResponse response = servletActionContext.getResponse (); Peta <String, Object> Data = HashMap baru <String, Object> (); Data.put ("Tanggal", Tanggal Baru ()); data.put ("email", "[email protected]"); data.put ("usia", 30); data.put ("name", "csdn"); data.put ("array", int baru [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// Jika klien tidak mengirim fungsi callback, gunakan fungsi callback default responseJsonutils.jsonp (respons, data); } else {// Gunakan fungsi panggilan balik klien responseJsonutils.jsonp (respons, callback, data); }} public String getCallback () {return callback; } public void setCallback (string callback) {this.callback = callback; }} impor org.springframework.steretype.controller; impor org.springframework.web.bind.annotation.requestmapping; /*** Spring MVC Mengembalikan data JSON dan JSONP*/@Controller @RequestMapping ("/JSON") kelas publik JSONController {/*** mengembalikan data JSON* @param permintaan* @param respons*/@requestmapping ("/json.do") public void json (httpservlet {httpservet ("/json") public void json (httpservet {httpservpars (httpservets (httpservaps (httpservaps (httpservaps (httpservaps (httpservaps (httpservpape " Object> data = hashmap baru <string, object> (); Data.put ("Tanggal", Tanggal Baru ()); data.put ("email", "[email protected]"); data.put ("usia", 30); data.put ("name", "csdn"); data.put ("array", int baru [] {1,2,3,4}); ResponseJsonutils.json (respons, data); } /** * Return JSONP data* @param callback JSONP's callback function* @param request * @param response */ @RequestMapping("/jsonp.do") public void json(String callback, HttpServletRequest request, HttpServletResponse response){ Map<String, Object> data = new HashMap<String, Object>(); Data.put ("Tanggal", Tanggal Baru ()); data.put ("email", "[email protected]"); data.put ("usia", 30); data.put ("name", "csdn"); data.put ("array", int baru [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// Jika klien tidak mengirim fungsi callback, gunakan fungsi callback default responseJsonutils.jsonp (respons, data); } else {// Gunakan fungsi panggilan balik klien responseJsonutils.jsonp (respons, callback, data); }}}