ที่นอนรองพื้น
ใน Java มี libs มากมายเกี่ยวกับ JSON เช่น Jackjson, Fastjson, GSON ฯลฯ ฉันได้ใช้พวกเขา แต่มันก็ยังคงหนักเกินไปสำหรับโปรแกรมเมอร์ที่ต้องทำให้วัตถุ Java กลับมาเป็นสตริง JSON ยิ่งไปกว่านั้นฟังก์ชั่นบางอย่างสามารถปรับแต่งได้มาก ตัวอย่างเช่นเมื่อแอตทริบิวต์ของวัตถุ Java ว่างเปล่าส่วนประกอบเหล่านี้จะไม่ส่งออก ดังนั้นเมื่อฉันวนผ่านวัตถุรายการบนหน้าฉันมักจะต้องตัดสินว่าแอตทริบิวต์นี้ไม่ได้กำหนดหรือไม่ซึ่งทำให้ฉันไม่พอใจมาก ดังนั้นฉันจึงตัดสินใจใช้เวลาในการศึกษาสิ่งที่เกิดขึ้น
แต่หลังจากมองหาเช้าวันหนึ่งฉันพบว่าทั้ง Fastjson และ GSON เขียนด้วยวิธีที่ซับซ้อนมากและไม่มีเอกสารหรือความคิดเห็นที่เกี่ยวข้องดังนั้นในที่สุดฉันก็ยอมแพ้ ดังนั้นฉันจึงพบแพ็คเกจ Java ที่ค่อนข้างง่ายที่ส่งคืน JSON ใน www.json.com Lib นี้ต้องการเพียง 5 คลาส Java ที่จะเรียกใช้ซึ่งเป็นสิ่งที่ฉันต้องการ ควรสังเกตว่า JsonArray อย่างเป็นทางการไม่สนับสนุนการแปลงโดยตรงของ Javabeans ตัวอย่างเช่นสิ่งต่าง ๆ เช่นรายการ <ผู้ใช้> ไม่สามารถแปลงได้ พวกเขาจะต้องถูกแปลงเป็นรูปแบบเช่นรายการ <pal> เพื่อแปลงดังนั้นฉันจึงแก้ไข เอกสารอย่างเป็นทางการรวมถึง:
ก่อนอื่นให้ฉันแนะนำการใช้งานขั้นพื้นฐาน
ใช้คลาส JSONObject เพื่อจัดการกับวัตถุ Java ขั้นพื้นฐานและการใช้งานมีดังนี้:
โมฆะสาธารณะ testmap () {map <string, object> map = new hashmap <string, object> (); map.put ("ชื่อ", "qiu"); map.put ("รหัสผ่าน", "123"); map.put ("ที่อยู่", "จีน"); ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setUserName ("qiuqiu"); user.setPassword ("123456"); user.getTels (). เพิ่ม ("1234445566677"); user.getTels (). เพิ่ม ("6893493458585"); map.put ("ผู้ใช้" ผู้ใช้); jsonObject json = new JsonObject (แผนที่); System.out.println (json.toString ()); - หากเป็นวัตถุคอลเลกชันจะใช้คลาส JSONARRAY และการใช้งานมีดังนี้:
Public Void TestList () พ่น jSonexception {list <ผู้ใช้> list = new ArrayList <user> (); ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setUserName ("qiuqiu"); user.setPassword ("123456"); user.getTels (). เพิ่ม ("1234445566677"); user.getTels (). เพิ่ม ("6893493458585"); ผู้ใช้ผู้ใช้ 2 = ผู้ใช้ใหม่ (); user2.setUserName ("จีน"); user2.getTels (). เพิ่ม ("12344445556677"); user2.getTels (). เพิ่ม ("6893493458585"); list.add (ผู้ใช้); list.add (user2); jsonArray json = new JsonArray (รายการ); System.out.println (json.toString (2)); - จากรหัสข้างต้นเราจะเห็นว่าการใช้ LIB นี้ค่อนข้างง่าย ไม่จำเป็นต้องใช้วัตถุใหม่เช่น GSON และการออกแบบ API ของ FastJson ก็ค่อนข้างไม่มีเหตุผลเช่นกัน ในรหัสที่สองด้านบนมี toString (2) ที่ระบุเอาต์พุตโดยการเยื้องสองช่องว่างในบรรทัดใหม่
ข้างต้นแนะนำการใช้งานขั้นพื้นฐานเท่านั้น แต่นี่ไม่ใช่สิ่งที่คุณต้องการ สิ่งที่คุณต้องการคือวิธีส่งคืนสตริงว่างเมื่อคุณสมบัติวัตถุว่างเปล่าแทนที่จะส่งคืนอะไรเลย แม้ว่าจะมีเพียง 5 ชั้นเรียน แต่ฉันใช้เวลาสองหรือสามชั่วโมงในการหาสถานที่ มีวิธีการที่เรียกว่า populatemap ใน jsonobject และในตอนท้ายมีรหัสชิ้นเล็ก ๆ :
Object result = method.invoke (ถั่ว, (วัตถุ []) null); if (result! = null) {this.map.put (key, wrap (result)); -นั่นคือเมื่อมีการเรียกเมธอดและส่งคืนเป็นโมฆะคุณสมบัตินี้ไม่ได้ส่งออก แน่นอนว่ามันง่ายมากที่จะเปลี่ยนแปลง:
Object result = method.invoke (ถั่ว, (วัตถุ []) null); this.map.put (key, result == null? "": wrap (result));
ในที่สุดสิ่งนี้ก็แก้ไขปัญหาที่ฉันต้องการแก้ไข แน่นอนว่า 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 [email protected]**/ การตอบสนองระดับสาธารณะ Jsonutils {/ *** การเข้ารหัสอักขระเริ่มต้น / *** ฟังก์ชั่นการโทรกลับเริ่มต้น JSONP*/ สตริงคงที่ส่วนตัว callback = "callback"; /*** การตั้งค่า Serialization FastJSON*/serializerfeature แบบคงที่ส่วนตัว [] คุณสมบัติ = ใหม่ serializerfeature [] {// ส่งออกค่าของ null ในแผนที่ serializerfeature.writemapnulluue, // ถ้าวัตถุบูลีนเป็นค่า null serializerfeature.writenulllistasempty, // ถ้าหมายเลขเป็นโมฆะเอาต์พุตคือ 0 serializerfeature.writenullnumberaszero, // output สตริง null serializerfeature.writenullstringaseMpty, // รูปแบบวันที่ส่งออก / *** Object Java Serialize JSON* @param OBJ Java Object ที่ต้องใช้ JSON Serialization* @return json String*/ สตริงคงที่ส่วนตัว tojsonstring (Object OBJ) {return json.tojsonstring (obj, คุณสมบัติ); }/*** ส่งคืนข้อมูลรูปแบบ JSON* @param Response* @param data data java วัตถุที่จะถูกส่งคืน* @param การเข้ารหัสส่งคืนรูปแบบการเข้ารหัสของสตริง JSON*/โมฆะคงที่สาธารณะ JSON (httpservletResponse การตอบสนองของวัตถุ Response.Setcharacterencoding (การเข้ารหัส); printwriter out = null; ลอง {out = response.getWriter (); out.write (toJSonstring (data)); out.flush (); } catch (ioexception e) {e.printstacktrace (); }} / *** ส่งคืนข้อมูลรูปแบบ JSON โดยใช้การเข้ารหัสเริ่มต้น* @param Response* @param data data java วัตถุที่จะส่งคืน* / โมฆะคงที่สาธารณะ JON (httpservletResponse การตอบสนอง, ข้อมูลวัตถุ) {JSON (การตอบสนอง, ข้อมูล, การเข้ารหัส); } / *** ส่งคืนข้อมูล JSONP โดยใช้การเข้ารหัสเริ่มต้นและฟังก์ชั่นการโทรกลับเริ่มต้น* @Param Response* @param data ข้อมูล JSONP* / โมฆะคงที่สาธารณะ jsonp (httpservletResponse การตอบสนองข้อมูลวัตถุ) {JSONP (การตอบสนองการโทรกลับข้อมูลการเข้ารหัส); } / *** ส่งคืนข้อมูล JSONP โดยใช้การเข้ารหัสเริ่มต้น* @Param Response* @Param การเรียกกลับ JSONP ชื่อฟังก์ชั่นการโทรกลับ* @param ข้อมูล JSONP ข้อมูล* / โมฆะคงที่สาธารณะ JSONP (httpservletResponse การตอบกลับสตริงข้อมูลวัตถุ) {jsonp (การตอบกลับ } / *** ส่งคืนข้อมูล JSONP* @param Response* @param callback JSONP ชื่อฟังก์ชั่นการโทรกลับ* @param ข้อมูล JSONP ข้อมูล* @param การเข้ารหัสข้อมูล JSONP* / โมฆะสาธารณะคง sb.append ("("); sb.append (tojsonstring (data)); sb.append (");"); // ตั้งค่ารูปแบบการเข้ารหัส Response.SetContentType ("text/plain; charset =" + การเข้ารหัส); Response.Setcharacterencoding (การเข้ารหัส); printwriter out = null; ลอง {out = response.getWriter (); out.write (sb.toString ()); out.flush (); } catch (ioexception e) {e.printstacktrace (); }} สตริงคงที่สาธารณะ getEncoding () {return encoding; } โมฆะคงที่สาธารณะ setEncoding (การเข้ารหัสสตริง) {ResponseJsonutils.encoding = การเข้ารหัส; } สตริงคงที่สาธารณะ getCallback () {return callback; } โมฆะคงที่สาธารณะ setCallback (สตริงโทรกลับ) {ResponseJsonutils.Callback = การโทรกลับ; -
/*** ส่งคืนข้อมูล JSON ใน servlet*/@webservlet ("/json.do") ระดับสาธารณะ JonSerservlet ขยาย httpservlet {ส่วนตัวคงที่สุดท้าย Long SerialVersionuid = 7500835936131982864L; / *** ส่งคืนข้อมูลรูปแบบ JSON*/ บริการโมฆะที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {map <string, data> data = new hashmap <string, object> (); data.put ("วันที่", วันที่ใหม่ ()); data.put ("อีเมล", "[email protected]"); data.put ("อายุ", 30); data.put ("ชื่อ", "CSDN"); data.put ("array", int ใหม่ [] {1,2,3,4}); Responsejsonutils.json (การตอบสนอง, ข้อมูล); - /*** Servlet ส่งคืนข้อมูลรูปแบบ JSONP*/@webservlet ("/jsonp.do") คลาสสาธารณะ JSONPSERVLET ขยาย HTTPSERVLET {ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = -8343408864035108293L; /*** คำขอจะส่งพารามิเตอร์การโทรกลับเป็นฟังก์ชันการโทรกลับ หากไม่มีการส่งพารามิเตอร์การโทรกลับฟังก์ชันการโทรกลับเริ่มต้นจะถูกใช้*/บริการโมฆะที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบกลับ httpservletResponse) โยน servletexception, ioexception {// ฟังก์ชั่นการโทรกลับที่ส่งโดยสตริงลูกค้า แผนที่ <string, object> data = new hashmap <string, object> (); data.put ("วันที่", วันที่ใหม่ ()); data.put ("อีเมล", "[email protected]"); data.put ("อายุ", 30); data.put ("ชื่อ", "CSDN"); data.put ("array", int ใหม่ [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// หากไคลเอนต์ไม่ส่งฟังก์ชั่นการโทรกลับให้ใช้ฟังก์ชั่นการเรียกกลับเริ่มต้นการตอบกลับ jsonutils.jsonp (ตอบกลับข้อมูล); } else {// ใช้ฟังก์ชั่นการโทรกลับของลูกค้า responsejsonutils.jsonp (การตอบกลับ, การโทรกลับ, ข้อมูล); - / ** * ส่งคืน JSON และ JSONP ใน struts2 */ คลาสสาธารณะ JSONACTION ขยายการดำเนินการ {ส่วนตัวคงที่สุดท้ายคงที่ความยาว serialVersionUID = 5391000845385666048L; / *** ฟังก์ชั่นการโทรกลับ JSONP*/ การโทรกลับสตริงส่วนตัว; / ** * ส่งคืน JSON */ โมฆะสาธารณะ json () {httpservletResponse response = servletactionContext.getResponse (); แผนที่ <string, object> data = new hashmap <string, object> (); data.put ("วันที่", วันที่ใหม่ ()); data.put ("อีเมล", "[email protected]"); data.put ("อายุ", 30); data.put ("ชื่อ", "CSDN"); data.put ("array", int ใหม่ [] {1,2,3,4}); Responsejsonutils.json (การตอบสนอง, ข้อมูล); } / ** * ส่งคืน JSONP * / โมฆะสาธารณะ jsonp () {httpservletResponse ตอบสนอง = servletactionContext.getResponse (); แผนที่ <string, object> data = new hashmap <string, object> (); data.put ("วันที่", วันที่ใหม่ ()); data.put ("อีเมล", "[email protected]"); data.put ("อายุ", 30); data.put ("ชื่อ", "CSDN"); data.put ("array", int ใหม่ [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// หากไคลเอนต์ไม่ส่งฟังก์ชั่นการโทรกลับให้ใช้ฟังก์ชั่นการเรียกกลับเริ่มต้นการตอบกลับ jsonutils.jsonp (ตอบกลับข้อมูล); } else {// ใช้ฟังก์ชั่นการโทรกลับของลูกค้า responsejsonutils.jsonp (การตอบกลับ, การโทรกลับ, ข้อมูล); }} สตริงสาธารณะ getCallback () {return callback; } โมฆะสาธารณะ setCallback (สตริงโทรกลับ) {this.callback = callback; - นำเข้า org.springframework.steretype.controller; นำเข้า org.springframework.web.bind.annotation.requestmapping; /*** สปริง MVC ส่งคืนข้อมูล JSON และ JSONP*/@Controller @RequestMapping ("/json") คลาสสาธารณะ JsonController {/*** ส่งคืนข้อมูล JSON* @Param Response* @param*/@requestmapping ("/json.do" data = new hashmap <string, object> (); data.put ("วันที่", วันที่ใหม่ ()); data.put ("อีเมล", "[email protected]"); data.put ("อายุ", 30); data.put ("ชื่อ", "CSDN"); data.put ("array", int ใหม่ [] {1,2,3,4}); Responsejsonutils.json (การตอบสนอง, ข้อมูล); }/*** ส่งคืนข้อมูล JSONP* @param callback ฟังก์ชั่นการโทรกลับของ JSONP* @param Request* @param Response*/@requestmapping ("/jsonp.do") โมฆะสาธารณะ JSON data.put ("วันที่", วันที่ใหม่ ()); data.put ("อีเมล", "[email protected]"); data.put ("อายุ", 30); data.put ("ชื่อ", "CSDN"); data.put ("array", int ใหม่ [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// หากไคลเอนต์ไม่ส่งฟังก์ชั่นการโทรกลับให้ใช้ฟังก์ชั่นการเรียกกลับเริ่มต้นการตอบกลับ jsonutils.jsonp (ตอบกลับข้อมูล); } else {// ใช้ฟังก์ชั่นการโทรกลับของลูกค้า responsejsonutils.jsonp (การตอบกลับ, การโทรกลับ, ข้อมูล); -