Foundation Matratze
In Java gibt es viele Bibliotheken über JSON, wie Jackjson, Fastjson, GSON usw. Ich habe sie benutzt, aber es scheint immer noch zu schwer für Programmierer, die das Java -Objekt nur eine JSON -Saite zurückgeben müssen. Darüber hinaus sind einige Funktionen sehr anpassbar. Wenn beispielsweise das Attribut eines Java -Objekts leer ist, werden diese Komponenten nicht ausgegeben. Wenn ich also das Listenobjekt auf der Seite durchschließe, muss ich immer beurteilen, ob dieses Attribut undefiniert ist, was mich sehr unzufrieden macht. Also entschied ich mich etwas Zeit, um zu studieren, was los war.
Aber nach einem engen Such nach einem Morgen stellte ich fest, dass sowohl Fastjson als auch GSON sehr kompliziert geschrieben wurden und es keine relevanten Dokumente oder Kommentare gab, also gab ich schließlich auf. Also fand ich ein relativ einfaches Java -Paket, das JSON auf www.json.com zurückgibt. Diese LIB braucht nur 5 Java -Klassen zum Ausführen, genau das ist das, was ich will. Es ist zu beachten, dass der offizielle JsonArray die direkte Konvertierung von JavaBeans nicht unterstützt. Beispielsweise können Dinge wie List <Künstler> nicht konvertiert werden. Sie müssen in ein Format wie List <Map> konvertiert werden, um es zu konvertieren, also habe ich es geändert. Offizielle Dokumente umfassen:
Lassen Sie mich zunächst die grundlegende Verwendung vorstellen.
Verwenden Sie die JSONObject -Klasse, um grundlegende Java -Objekte zu verarbeiten, und die Verwendung ist grob wie folgt:
public void testMap () {map <String, Objekt> map = new HashMap <String, Object> (); map.put ("name", "qiu"); map.put ("Passwort", "123"); map.put ("Adresse", "China"); User user = new user (); user.setUserName ("qiuqiu"); user.setPassword ("123456"); user.gettels (). add ("123444556677"); user.gettels (). add ("6893493458585"); map.put ("Benutzer", Benutzer); JsonObject JSON = new JsonObject (MAP); System.out.println (json.toString ()); } Wenn es sich um ein Sammlungsobjekt handelt, wird die JsonArray -Klasse verwendet und die Verwendung ist wie folgt:
public void testlist () löscht jSonexception {list <Bener> list = new ArrayList <Bener> () aus; User user = new user (); user.setUserName ("qiuqiu"); user.setPassword ("123456"); user.gettels (). add ("123444556677"); user.gettels (). add ("6893493458585"); User user2 = new user (); user2.setUserName ("China"); user2.gettels (). add ("1234444556677"); user2.gettels (). add ("6893493458585"); list.add (Benutzer); list.add (user2); JsonArray Json = New JsonArray (Liste); System.out.println (json.toString (2)); } Aus dem obigen Code können wir erkennen, dass die Verwendung dieser LiB recht einfach ist. Es erfordert kein neues Objekt wie GSON, und das API -Design von Fastjson ist ebenfalls etwas unangemessen. Im zweiten Code oben gibt es ein ToString (2), der die Ausgabe angibt, indem zwei Leerzeichen in einer neuen Zeile eingerichtet werden.
Das obige führt nur die grundlegende Verwendung ein, aber das ist nicht das, was Sie wollen. Was Sie wollen, ist, wie Sie eine leere Zeichenfolge zurückgeben, wenn die Objekteigenschaft leer ist, anstatt nichts zurückzugeben. Obwohl es nur 5 Klassen gibt, brauchte ich zwei oder drei Stunden, um den Ort zu finden. Es gibt eine Methode namens Populatemap in JsonObject, und am Ende gibt es ein kleines Stück Code:
Objektergebnis = Methode.invoke (Bean, (Objekt []) null); if (result! = null) {this.map.put (Schlüssel, Wrap (Ergebnis)); }Das heißt, wenn die GET -Methode aufgerufen und als Null zurückgegeben wird, wird diese Eigenschaft nicht ausgegeben. Natürlich ist es sehr einfach zu ändern:
Objektergebnis = Methode.invoke (Bean, (Objekt []) null); this.map.put (Schlüssel, Ergebnis == NULL? "": Wrap (Ergebnis));
Dies löste schließlich das Problem, das ich lösen wollte. Natürlich wird diese LIB offiziell von JSON gebracht und ganz einfach geschrieben. Es ist besser für Situationen geeignet, in denen es jeweils nur wenige oder Dutzende Daten gibt, z. B. Pagination Display. Wenn die Menge der Daten, die jeweils übertragen werden, relativ groß ist, können Sie in Betracht ziehen, Fastjson usw. zu verwenden. Ich persönlich denke jedoch, dass die meisten Gelegenheiten die notwendigste Anpassung ist. Wenn Sie beispielsweise gelegentlich eine bestimmte Komponente finden, die den Anforderungen nicht erfüllen kann, hat die Komponente keine Dokumentation oder Kommentare, und der Code ist schwer zu verstehen, was im Grunde genommen nicht die gleiche ist wie Open Source, so dass er keine Bedeutung hat.
Beispielzusammenfassung
importieren java.io.ioException; Import Java.io.printwriter; importieren javax.servlet.http.httpServletResponse; Import com.alibaba.fastjson.json; import com.alibaba.fastjson.serializer.SerializerFeature; / **** Webserver gibt die JSON-Werkzeugklasse zurück. / *** JSONP -Standard -Rückruffunktion*/ private statische String callback = "callback"; /*** FASTJSON -Serialisierungseinstellungen*/private statische SerializerFeature [] features = new SerializerFeature [] {// Der Wert von Null in der Karte serializerFeature.WritemapnullValue, // Wenn das Boolesche Objekt ist, ist die Ausgabe, die Ausgabe ist, die Ausgabe ist. SerializerFeature.WriteNullListasempty, // Wenn die Nummer null ist, ist die Ausgabe 0 serializerFeature.writenullNumberaszero, // Ausgabe Null String serializerFeature.writeNullStringasEmpty, // formatieren Sie die Ausgabedatum SerializerFeature.witedateUseDateDeFormat}; / *** serialisieren Sie Java -Objekt JSON* @param obj Java -Objekt, das JSON Serialisierung erfordert* @return json String*/ private statische String tojonstring (Objekt obj) {return json.tojonstring (OBJ, Features); }/*** Return JSON -Formatdaten* @Param Antwort* @param data Java -Objekt, die zurückgegeben werden soll response.setcharactercoding (codieren); Printwriter out = null; try {out = response.getWriter (); out.write (tojonstring (data)); out.flush (); } catch (ioException e) {e.printstacktrace (); }} / *** JSON -Formatdaten mit der Standard -Codierung zurückgeben* @param response* @param -Daten Java -Objekt, die zurückgegeben werden soll } / *** Rückgabe von JSONP -Daten unter Verwendung der Standard -Codierung und Standard -Rückruffunktionen* @param Antwort* @param -Daten JSONP -Daten* / public static void JSONP (httpServletResponse -Antwort, Objektdaten) {JSONP (Antwort, Rückruf, Daten, Codierung); } / *** JSONP -Daten zurückgeben, indem Sie die Standard -Codierung verwenden* @Param Antwort* @param Callback JSONP -Rückruffunktionsname* @param -Daten JSONP -Daten* / public static void jsonp (httpServletResponse -Antwort, String -Rückruf, Objektdaten) {JSONP (Antwort, Callback, Daten, Daten, Codierung); } / *** return jsonp data* @param response* @param callback JSONP -Rückruffunktion Name* @param data jsonp data* @param codieren jsonp data* / public static void jsonp (httpServletResponse -Antwort, String -Rückruf, Objektdaten, String -Coding) {StringBuffer SBER SB = NEW NEWSBUFFER (CALLBAR); sb.Append ("("); sb.Append (tojonstring (data)); // Setzen Sie die Antwort des Codierungsformates. response.setcharactercoding (codieren); Printwriter out = null; try {out = response.getWriter (); out.write (sb.tostring ()); out.flush (); } catch (ioException e) {e.printstacktrace (); }} public static String getCoding () {return coding; } public static void setEneCoding (String coding) {responsejsonUtils.encoding = codieren; } public static String getCallback () {return callback; } public static void setCallback (String Callback) {responsejsonUtils.callback = callback; }} /*** RECHT JSON -Daten in Servlet*/@webservlet ("/json.do") öffentliche Klasse JsonServlet erweitert HttpServlet {private statische endgültige long serialversionuid = 7500835936131982864l; / *** JSON -Formatdaten zurückgeben. Data.put ("Datum", neues Datum ()); Data.put ("E -Mail", "[email protected]"); Data.put ("Alter", 30); Data.put ("Name", "CSDN"); Data.put ("Array", New int [] {1,2,3,4}); ResponsejsonUtils.json (Antwort, Daten); }} /*** Servlet gibt JSONP -Formatdaten zurück*/@webservlet ("/jsonp.do") Public Class JsonpServlet erweitert HttpServlet {private statische endgültige long serialversionuid = -8343408864035108293l; /*** Die Anforderung sendet den Rückrufparameter als Rückruffunktion. Wenn der Rückrufparameter nicht gesendet wird, wird die Standard -Rückruffunktion verwendet. MAP <string, Object> data = new HashMap <String, Object> (); Data.put ("Datum", neues Datum ()); Data.put ("E -Mail", "[email protected]"); Data.put ("Alter", 30); Data.put ("Name", "CSDN"); Data.put ("Array", New int [] {1,2,3,4}); if (callback == null || callback. } else {// Verwenden Sie die Rückruffunktion des Clients ResponsejsonUtils.jsonp (Antwort, Rückruf, Daten); }}}} / ** * Return JSON und JSONP in Struts2 */ Public Class JsonAction erweitert die Aktionsversorgung {private statische endgültige lange Serialversionuid = 5391000845385666048L; / *** JSONP -Rückruffunktion*/ private String -Rückruf; / ** * return JSON */ public void json () {httpServletResponse response = servletActionContext.getResponse (); MAP <string, Object> data = new HashMap <String, Object> (); Data.put ("Datum", neues Datum ()); Data.put ("E -Mail", "[email protected]"); Data.put ("Alter", 30); Data.put ("Name", "CSDN"); Data.put ("Array", New int [] {1,2,3,4}); ResponsejsonUtils.json (Antwort, Daten); } / ** * return JSONP * / public void jsonp () {httpServletResponse response = servletActActionContext.getResponse (); MAP <string, Object> data = new HashMap <String, Object> (); Data.put ("Datum", neues Datum ()); Data.put ("E -Mail", "[email protected]"); Data.put ("Alter", 30); Data.put ("Name", "CSDN"); Data.put ("Array", New int [] {1,2,3,4}); if (callback == null || callback. } else {// Verwenden Sie die Rückruffunktion des Clients ResponsejsonUtils.jsonp (Antwort, Rückruf, Daten); }} public String getCallback () {return callback; } public void setCallback (String Callback) {this.callback = callback; }} import org.springframework.steretype.controller; import org.springframework.web.bind.annotation.RequestMapping; /*** Spring MVC gibt JSON- und JSONP -Daten zurück. MAP <string, Object> data = new HashMap <String, Object> (); Data.put ("Datum", neues Datum ()); Data.put ("E -Mail", "[email protected]"); Data.put ("Alter", 30); Data.put ("Name", "CSDN"); Data.put ("Array", New int [] {1,2,3,4}); ResponsejsonUtils.json (Antwort, Daten); } /** * 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 ("Datum", neues Datum ()); Data.put ("E -Mail", "[email protected]"); Data.put ("Alter", 30); Data.put ("Name", "CSDN"); Data.put ("Array", New int [] {1,2,3,4}); if (callback == null || callback. } else {// Verwenden Sie die Rückruffunktion des Clients ResponsejsonUtils.jsonp (Antwort, Rückruf, Daten); }}}