Matelas de fondation
En Java, il y a beaucoup de LIB sur JSON, comme Jackjson, Fastjson, GSON, etc. Je les ai utilisés, mais cela semble toujours trop lourd pour les programmeurs qui n'ont qu'à faire en sorte que l'objet Java renvoie une chaîne JSON. De plus, certaines fonctions sont très personnalisables. Par exemple, lorsque l'attribut d'un objet Java est vide, ces composants ne sortiront pas. Par conséquent, lorsque je parcourt l'objet de liste sur la page, je dois toujours juger si cet attribut n'est pas défini, ce qui me rend très insatisfait. J'ai donc décidé de prendre un certain temps pour étudier ce qui se passait.
Mais après un respect de près pour une matinée, j'ai constaté que Fastjson et Gson ont été écrits de manière très compliquée, et il n'y avait pas de documents ou de commentaires pertinents, alors j'ai finalement abandonné. J'ai donc trouvé un package Java relativement simple qui renvoie JSON sur www.json.com. Cette lib n'a besoin que de 5 cours Java à fonctionner, ce que je veux. Il convient de noter que le JSONArray officiel ne prend pas en charge la conversion directe des Javabeans. Par exemple, des choses comme la liste <servy> ne peuvent pas être converties. Ils doivent être convertis en un format comme la liste <map> à convertir, donc je l'ai modifié. Les documents officiels comprennent:
Permettez-moi d'abord de présenter l'utilisation de base.
Utilisez la classe JSONObject pour gérer les objets Java de base, et l'utilisation est à peu près la suivante:
public void testmap () {map <string, object> map = new hashmap <string, object> (); map.put ("name", "qiu"); map.put ("mot de passe", "123"); map.put ("adresse", "Chine"); Utilisateur utilisateur = nouveau utilisateur (); user.setUsername ("qiuqiu"); user.setpassword ("123456"); user.gettels (). add ("1234445556677"); user.gettels (). add ("6893493458585"); map.put ("utilisateur", utilisateur); JSONObject JSON = new JSONObject (MAP); System.out.println (json.toString ()); } S'il s'agit d'un objet de collection, la classe JSONArray est utilisée et l'utilisation est la suivante:
public void TestList () lève jSonException {list <utilisateur> list = new ArrayList <User> (); Utilisateur utilisateur = nouveau utilisateur (); user.setUsername ("qiuqiu"); user.setpassword ("123456"); user.gettels (). add ("1234445556677"); user.gettels (). add ("6893493458585"); User user2 = new User (); User2.SetUsername ("Chine"); user2.getTels (). add ("12344445556677"); user2.gettels (). add ("6893493458585"); list.add (utilisateur); list.add (user2); JSONArray JSON = new JSONArray (liste); System.out.println (json.tostring (2)); } D'après le code ci-dessus, nous pouvons voir que l'utilisation de cette lib est assez simple. Il ne nécessite pas un nouvel objet comme GSON, et la conception de l'API de Fastjson est également quelque peu déraisonnable. Dans le deuxième code ci-dessus, il y a un tostring (2) qui indique la sortie en indant deux espaces dans une nouvelle ligne.
Ce qui précède introduit uniquement l'utilisation de base, mais ce n'est pas ce que vous voulez. Ce que vous voulez, c'est comment renvoyer une chaîne vide lorsque la propriété de l'objet est vide, plutôt que de ne rien retourner. Bien qu'il n'y ait que 5 cours, il m'a fallu deux ou trois heures pour trouver l'endroit. Il existe une méthode appelée populatemap dans jsonObject, et à la fin il y a un petit morceau de code:
Objet résultat = méthode.invoke (bean, (objet []) null); if (result! = null) {this.map.put (key, wrap (result)); }Autrement dit, lorsque la méthode GET est appelée et renvoyée comme nul, cette propriété n'est pas sortie. Bien sûr, il est très simple à changer:
Objet résultat = méthode.invoke (bean, (objet []) null); this.map.put (clé, résultat == null? "": wrap (result));
Cela a finalement résolu le problème que je voulais résoudre. Bien sûr, cette lib est officiellement apportée par JSON et est écrite tout simplement. Il convient plus aux situations où il n'y a que quelques ou dizaines de données à la fois, comme l'affichage de la pagination. Si la quantité de données transmises à la fois est relativement importante, vous pouvez envisager d'utiliser FastJson, etc. Mais je pense personnellement que pour la plupart des occasions, la personnalisation la plus nécessaire est. Par exemple, si vous trouvez occasionnellement un certain composant qui ne peut pas répondre aux besoins, le composant n'a pas de documentation ou de commentaires, et le code est difficile à comprendre, ce qui est fondamentalement le même que non open source, afin qu'il n'ait aucun sens.
Exemple de résumé
Importer java.io.ioException; import java.io.printwriter; import javax.servlet.http.httpservletResponse; import com.alibaba.fastjson.json; import com.alibaba.fastjson.serializer.serializerfeature; / ** * * Web Server renvoie JSON Tool Class * La classe d'outils dépend de FastJSON * La classe d'outils prend en charge le rendement des données de format JSON et JSONP * @author [email protected] * * / classe publique ResponseJSonUtils {/ ** * Encoding de caractères par défaut * / private Static String Encoding = "utf-8"; / ** * Fonction de rappel par défaut JSONP * / Private Static String callback = "callback"; / ** * Paramètres de sérialisation FastJSON * / Sérializer statique privé [] fonctionnalités = nouveau sérializerFeature [] {// Sortie la valeur de Null dans l'objet Sérializer.WRITEMAPNULLVALUE, // Si l'objet booléen est null, la sortie est une fausse série, la production est []. SerializerFeature.WriTenullListasEmpty, // Si le numéro est nul, la sortie est 0 SerializerFeature.WritenullNumberAszero, // Null String SerializerFeature.WritenullStringasEmpty, // Format la date de sortie SerializerFeature.WRITEADATATEATORMAT}; / ** * sérialiser l'objet java json * @param obj objet java qui nécessite JSON Serialization * @return json string * / private static string tojSontring (objet obj) {return json.tojSontring (obj, features); } / ** * Renvoie des données de format JSON * @Param Response * @param data java objet à retourner * @param codage return le format d'encodage de la chaîne JSON * / public static void JSON (httpservletResponse réponse, données d'objet, chaîne Encoding) {// Définit le format d'encodage. Response.Setcharacterencoding (codage); Printwriter out = null; try {out = réponse.getWriter (); out.write (tojSontring (data)); out.flush (); } catch (ioException e) {e.printStackTrace (); }} / ** * Renvoie des données de format JSON, en utilisant l'encodage par défaut * @param réponse * @param data java objet à renvoyer * / public static void JSON (réponse httpservletResponse, données d'objet) {json (réponse, données, encodage); } / ** * Renvoie des données JSONP, en utilisant le codage par défaut et les fonctions de rappel par défaut * @Param Response * @param data JSONP data * / public static void JSONP (httpservletResponse réponse, données d'objet) {JSONP (réponse, rappel, données, encodage); } / ** * Renvoie les données JSONP, en utilisant l'encodage par défaut * @param réponse * @param rappel jsonp function function name * @param data data jsonp * / public static void JSONP (httpservletResponse réponse, file callback, objet data) {JSONP (réponse, rappel, données, encodage); } / ** * Renvoie des données JSONP * @Param Response * @Param Callback JSONP Fonction Fonction Nom * @param Données JSONP Données * @Param Encoding JSONP Data * / Public Static void JSONP (HttpServletResponse Response, String Callback, Object Data, String Encoding) {StringBuffer SB = New StringBuffer (rappel); SB.APPEND ("("); SB.APPEND (TOJSONSTRING (DATA)); SB.APPEND (");"); // Définit le format de codage Response.SetContentType ("Text / PLAIN; charset =" + Encoding); Response.Setcharacterencoding (codage); Printwriter out = null; try {out = réponse.getWriter (); out.write (sb.toString ()); out.flush (); } catch (ioException e) {e.printStackTrace (); }} public static String getEncoding () {return Encoding; } public static void setEncoding (String Encoding) {réponsejsonUtils.encoding = Encoding; } public static static getCallback () {return callback; } public static void setCallback (string callback) {réponsejsonUtils.callback = callback; }}
/ ** * Renvoie des données JSON dans servlet * / @webservlet ("/ json.do") La classe publique JSonServlet étend httpservlet {private static final long SerialVersionUID = 7500835936131982864L; / ** * RETOUR DATA FORMAT JSON * / Protected void Service (HttpServLetRequest Request, HttpServletResponse Response) lève Servlexception, ioException {map <string, object> data = new Hashmap <String, object> (); data.put ("Date", new Date ()); data.put ("e-mail", "[email protected]"); data.put ("âge", 30); data.put ("nom", "csdn"); data.put ("array", new int [] {1,2,3,4}); ResponseJSonUtils.json (réponse, données); }} / ** * Servlet Renvoie les données de format JSONP * / @webservlet ("/ jsonp.do") La classe publique JSONPServlet étend HttpServlet {private static final SerialVersionUID = -8343408864035108293l; / ** * La demande enverra le paramètre de rappel sous forme de fonction de rappel. Si le paramètre de rappel n'est pas envoyé, la fonction de rappel par défaut sera utilisée * / Protected void Service (HttpServLetRequest Request, HttpServletResponse Response) lance ServletException, ioException {// la fonction de rappel envoyée par la chaîne client callback = request.getParameter ("callback"); Map <string, object> data = new HashMap <String, object> (); data.put ("Date", new Date ()); data.put ("e-mail", "[email protected]"); data.put ("âge", 30); data.put ("nom", "csdn"); data.put ("array", new int [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// Si le client n'envoie pas de fonction de rappel, utilisez la fonction de rappel par défaut ResponseJsonUtils.jsonp (réponse, données); } else {// Utilisez la fonction de rappel du client ResponseJSonUtils.jsonp (réponse, rappel, données); }}}} / ** * Renvoie JSON et JSONP dans Struts2 * / public class JsonAction étend ActionSupport {private static final long SerialVersionUID = 5391000845385666048l; / ** * Fonction de rappel JSONP * / Rappel privé de chaîne; / ** * return json * / public void json () {httpservletResponse réponse = servletActionContext.getResponse (); Map <string, object> data = new HashMap <String, object> (); data.put ("Date", new Date ()); data.put ("e-mail", "[email protected]"); data.put ("âge", 30); data.put ("nom", "csdn"); data.put ("array", new int [] {1,2,3,4}); ResponseJSonUtils.json (réponse, données); } / ** * return JSONP * / public void JSONP () {httpServletResponse Response = servletActionContext.getResponse (); Map <string, object> data = new HashMap <String, object> (); data.put ("Date", new Date ()); data.put ("e-mail", "[email protected]"); data.put ("âge", 30); data.put ("nom", "csdn"); data.put ("array", new int [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// Si le client n'envoie pas de fonction de rappel, utilisez la fonction de rappel par défaut ResponseJsonUtils.jsonp (réponse, données); } else {// Utilisez la fonction de rappel du client ResponseJSonUtils.jsonp (réponse, rappel, données); }} 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 Renvoie les données JSON et JSONP * / @Controller @RequestMapping ("/ JSON") Classe publique JSONController {/ ** * RETOUR DATA JSON * @PARAM Request * @param réponse * / @requestmapping ("/ json.do") public Void JSON (HTTPSERVERQUEST DEMAND data = new HashMap <String, objet> (); data.put ("Date", new Date ()); data.put ("e-mail", "[email protected]"); data.put ("âge", 30); data.put ("nom", "csdn"); data.put ("array", new int [] {1,2,3,4}); ResponseJSonUtils.json (réponse, données); } / ** * Renvoie des données JSONP * @param function de rappel de JSONP * @param request * @param réponse * / @RequestMapping ("/ jSonp.do") public void json (string callback, httpServleRequest request, httpservletResponse réponse) {map <string> data = new hashmap <String, objet> ();); data.put ("Date", new Date ()); data.put ("e-mail", "[email protected]"); data.put ("âge", 30); data.put ("nom", "csdn"); data.put ("array", new int [] {1,2,3,4}); if (callback == null || callback.length () == 0) {// Si le client n'envoie pas de fonction de rappel, utilisez la fonction de rappel par défaut ResponseJsonUtils.jsonp (réponse, données); } else {// Utilisez la fonction de rappel du client ResponseJSonUtils.jsonp (réponse, rappel, données); }}}