Colchón de base
En Java, hay muchas bibliotecas sobre JSON, como Jackjson, Fastjson, Gson, etc. Los he usado, pero todavía parece demasiado pesado para los programadores que solo necesitan hacer que el objeto Java devuelva una cadena JSON. Además, algunas funciones son muy personalizables. Por ejemplo, cuando el atributo de un objeto Java está vacío, estos componentes no saldrán. Por lo tanto, cuando recorro el objeto de lista en la página, siempre tengo que juzgar si este atributo no está definido, lo que me hace muy insatisfecho. Así que decidí tomarme un tiempo para estudiar lo que estaba pasando.
Pero después de una mirada cercana para una mañana, descubrí que tanto Fastjson como Gson estaban escritos de una manera muy complicada, y no había documentos o comentarios relevantes, por lo que finalmente me di por vencido. Así que encontré un paquete Java relativamente simple que devuelve JSON en www.json.com. Esta lib solo necesita 5 clases de Java para ejecutar, que es exactamente lo que quiero. Cabe señalar que el JsonArray oficial no apoya la conversión directa de Javabeans. Por ejemplo, cosas como List <serem> no se pueden convertir. Deben convertirse en un formato como List <Map> para convertirlo, por lo que lo modifiqué. Los documentos oficiales incluyen:
Permítanme presentar primero el uso básico.
Use la clase JSONObject para manejar objetos Java básicos, y el uso es más o menos como sigue:
public void testMap () {map <string, object> map = new Hashmap <String, object> (); map.put ("nombre", "qiu"); map.put ("contraseña", "123"); map.put ("Dirección", "China"); Usuario user = nuevo usuario (); user.setUsername ("Qiuqiu"); user.setPassword ("123456"); user.gettels (). add ("123444556677"); user.gettels (). add ("6893493458585"); map.put ("usuario", usuario); JsonObject json = new JsonObject (mapa); System.out.println (json.ToString ()); } Si es un objeto de recolección, se usa la clase JSONArray, y el uso es el siguiente:
public void testList () lanza JSOnException {list <serer> list = new ArrayList <Serer> (); Usuario user = nuevo usuario (); user.setUsername ("Qiuqiu"); user.setPassword ("123456"); user.gettels (). add ("123444556677"); user.gettels (). add ("6893493458585"); Usuario user2 = new User (); user2.setUsername ("China"); user2.gettels (). add ("1234444556677"); user2.gettels (). add ("6893493458585"); list.add (usuario); list.add (user2); JSONArray JSON = New JsonArray (lista); System.out.println (json.ToString (2)); } Del código anterior, podemos ver que el uso de esta lib es bastante simple. No requiere un nuevo objeto como GSON, y el diseño de API de Fastjson también es algo irrazonable. En el segundo código anterior, hay una tostración (2) que indica la salida al sangrar dos espacios en una nueva línea.
Lo anterior solo presenta el uso básico, pero esto no es lo que quieres. Lo que desea es cómo devolver una cadena vacía cuando la propiedad del objeto está vacía, en lugar de no devolver nada. Aunque solo hay 5 clases, me llevó dos o tres horas encontrar el lugar. Hay un método llamado PopulateMap en JSONObject, y al final hay un pequeño trozo de código:
Resultado del objeto = método.invoke (bean, (objeto []) nulo); if (resultado! = null) {this.map.put (key, wrap (resultado)); }Es decir, cuando el método GET se llama y devuelve como nula, esta propiedad no se produce. Por supuesto, es muy simple de cambiar:
Resultado del objeto = método.invoke (bean, (objeto []) nulo); this.map.put (clave, resultado == nulo? "": wrap (resultado));
Esto finalmente resolvió el problema que quería resolver. Por supuesto, esta lib es traída oficialmente por JSON y está escrita simplemente. Es más adecuado para situaciones en las que solo hay unas pocas o docenas de datos a la vez, como la pantalla de paginación. Si la cantidad de datos transmitidos a la vez es relativamente grande, puede considerar usar FastJson, etc., pero personalmente creo que para la mayoría de las ocasiones, la personalización más necesaria es. Por ejemplo, si ocasionalmente encuentra un determinado componente que no puede satisfacer las necesidades, el componente no tiene documentación ni comentarios, y el código es difícil de entender, que es básicamente el mismo que no de código abierto, por lo que no tiene sentido.
Resumen de ejemplo
import java.io.ioException; import java.io.printwriter; import javax.servlet.http.httpservletResponse; import com.alibaba.fastjson.json; import com.alibaba.fastjson.serializer.serializerFeature; / **** El servidor web devuelve la clase de herramientas JSON* La clase de herramientas depende de Fastjson* La clase de herramientas admite que devuelve los datos de formato JSON y JSONP* @author [email protected]**/ public Class ResponsejsonUtils {/ *** Encodificación de caracteres predeterminada*/ String estático privado Encoding = "UTF-8"; / *** JSONP Función de devolución de llamada predeterminada*/ private static string llamado = "devolución de llamada"; /** * FastJSON serialization settings*/ private static SerializerFeature[] features = new SerializerFeature[]{ //Output the value of Null in the Map SerializerFeature.WriteMapNullValue, //If the Boolean object is Null, the output is false SerializerFeature.WriteNullBooleanAsFalse, //If List is Null, the output is [] SerializerFeature.WriteNullListAsEmpty, // Si el número es nulo, la salida es 0 SerializerFeature.WriteNullNumberAszero, // Salida NULL String SerializerFeature.WriteNullStringASEmpty, // Formatear la fecha de salida SerializerFeature.WritedateSeUtileformat}; / *** Serializar objeto java json* @param obj Java Object que requiere serialización JSON* @return json string*/ private static string tojSonstring (object obj) {return json.tojsonstring (obj, características); }/*** return JSON Format Data* @param Respuesta* @param Data Java Object se devolverá* @param codificación Devuelve el formato de codificación de la cadena JSON*/public static void json (httpServletReSponse Respuesta, datos de objeto, codificación de cadena) {// Establecer el formato de codificación. respuesta.setcharacteriCoding (codificación); PrintWriter out = null; intente {out = respuesta.getwriter (); out.write (tojsonstring (datos)); out.flush (); } catch (ioException e) {E.PrintStackTrace (); }} / *** Return JSON Format Data, utilizando la codificación predeterminada* @param respuesta* @param data objeto Java para devolver* / public static void json (httpservletResponse respuesta, datos de objeto) {json (respuesta, datos, codificación); } / *** return JSONP Datos, utilizando funciones predeterminadas de codificación y devolución de llamada predeterminada* @param respuesta* @param datos JSONP Datos* / public static void jsonp (httpServletResponse Respuesta, datos de objeto) {JSONP (respuesta, devolución de llamada, datos, codificación); } / *** return JSONP Datos, utilizando la codificación predeterminada* @param respuesta* @param devolución de llamada JSONP Nombre de función de devolución de llamada* @param datos JSONP* / public static void jsonp (httpServletResponse Respuesta, cadena de cadena, datos de objetos) {JSONP (respuesta, devolución de llamada, datos, codificación); } / *** return JSONP Data* @param Respuesta* @param Nombre de función de devolución de llamada JSONP* @param datos jsonp data* @param codificación de datos jsonp* / public static void jsonp (httpServletResponse respuesta, devolución de llamada, datos de objetos, codificación de cadena) {stringBuffer sb = new Stringbuffer); sb.append ("("); sb.append (tojsonstring (data)); sb.append (");"); // Establecer la respuesta del formato de codificación respuesta.setcharacteriCoding (codificación); PrintWriter out = null; intente {out = respuesta.getwriter (); out.write (sb.ToString ()); out.flush (); } catch (ioException e) {E.PrintStackTrace (); }} public static string getenCoding () {return coding; } public static void setEncoding (codificación de cadena) {ResponsejsonUtils.Encoding = coding; } public static String getCallback () {return Callback; } public static void setCallback (String Callback) {ResponsejsonUtils.callback = Callback; }}
/*** Devuelve datos JSON en servlet*/@webservlet ("/json.do") clase pública JSonServlet extiende httpservlet {private static final long SerialVersionUid = 7500835936131982864l; / *** return JSON Format Data*/ Protected Void Service (HttpServletRequest Solicitud, respuesta httpServletResponse) tira servletException, ioexception {map <string, object> data = new Hashmap <String, Object> (); data.put ("fecha", nueva fecha ()); data.put ("Correo electrónico", "[email protected]"); data.put ("edad", 30); data.put ("nombre", "csdn"); data.put ("array", new int [] {1,2,3,4}); ResponsejsonUtils.json (respuesta, datos); }} /*** Servlet Devuelve datos de formato JSONP*/@webservlet ("/jsonp.do") clase pública JSONPServlet extiende httpservlet {private estático final long SerialVersionUid = -83434088644035108293l; /*** La solicitud enviará el parámetro de devolución de llamada como una función de devolución de llamada. Si no se envía el parámetro de devolución de llamada, la función de devolución de llamada predeterminada se utilizará*/Proteged void Service (HTTPServletRequest Solicitud, HttpServletResponse Respuesta) lanza ServletException, ioException {// la función de devolución de llamada enviada por la cadena del cliente = request.getParameter ("devolución de llamada"); Map <string, object> data = new HashMap <String, Object> (); data.put ("fecha", nueva fecha ()); data.put ("Correo electrónico", "[email protected]"); data.put ("edad", 30); data.put ("nombre", "csdn"); data.put ("array", new int [] {1,2,3,4}); if (callback == NULL || Callback.length () == 0) {// Si el cliente no envía una función de devolución de llamada, use la función de devolución de llamada predeterminadajsonUtils.jsonp (respuesta, datos); } else {// use la función de devolución de llamada del cliente ResponsejsonUtils.jsonp (respuesta, devolución de llamada, datos); }}}} / ** * Return JSON y JSONP en Struts2 */ Public Class JSONACTION extiende ActionSupport {Private estático final Long SerialVersionUid = 539100084538566048l; / *** JSONP Función de devolución de llamada*/ String de cadena privada; / ** * return json */ public void json () {httpservletResponse respuesta = servletactionContext.getResponse (); Map <string, object> data = new HashMap <String, Object> (); data.put ("fecha", nueva fecha ()); data.put ("Correo electrónico", "[email protected]"); data.put ("edad", 30); data.put ("nombre", "csdn"); data.put ("array", new int [] {1,2,3,4}); ResponsejsonUtils.json (respuesta, datos); } / ** * return jsonp * / public void jsonp () {httpservletResponse respuesta = servletactionContext.getResponse (); Map <string, object> data = new HashMap <String, Object> (); data.put ("fecha", nueva fecha ()); data.put ("Correo electrónico", "[email protected]"); data.put ("edad", 30); data.put ("nombre", "csdn"); data.put ("array", new int [] {1,2,3,4}); if (callback == NULL || Callback.length () == 0) {// Si el cliente no envía una función de devolución de llamada, use la función de devolución de llamada predeterminadajsonUtils.jsonp (respuesta, datos); } else {// use la función de devolución de llamada del cliente ResponsejsonUtils.jsonp (respuesta, devolución de llamada, datos); }} public String getCallback () {return Callback; } public void setCallback (cadena de cadena) {this.callback = llamado; }} importar org.springframework.steretype.controller; importar org.springframework.web.bind.annotation.requestMapping; /*** Spring MVC Devuelve datos JSON y JSONP*/@Controller @RequestMapping ("/json") public class jsonController {/*** return json data* @param solicitud* @param respuesta*/@RequestMapping ("/json.do") public void json (httpServeRet solicitud, httpServeTRetRespespess ("/json.do") public void json (httpservletRequest solicitud, httpservletRetReSpessRespesserPonsespessespessespSespessespsespSespesspessespsespSespSespSEpsespsesponsespsespSEpsespsespAnses. data = new HashMap <String, Object> (); data.put ("fecha", nueva fecha ()); data.put ("Correo electrónico", "[email protected]"); data.put ("edad", 30); data.put ("nombre", "csdn"); data.put ("array", new int [] {1,2,3,4}); ResponsejsonUtils.json (respuesta, datos); }/*** return JSONP Data* @param Callback's Callback Función de devolución de llamada de JSONP* @Param Solicitud* @param Respuesta*/@RequestMapping ("/jsonp.do") public void json (cadena callback, htttpservletRequest request, httpServletResponse respuesta) {map <string> data = data = new Hashmap <string, objeto, objeto> ();););););); data.put ("fecha", nueva fecha ()); data.put ("Correo electrónico", "[email protected]"); data.put ("edad", 30); data.put ("nombre", "csdn"); data.put ("array", new int [] {1,2,3,4}); if (callback == NULL || Callback.length () == 0) {// Si el cliente no envía una función de devolución de llamada, use la función de devolución de llamada predeterminadajsonUtils.jsonp (respuesta, datos); } else {// use la función de devolución de llamada del cliente ResponsejsonUtils.jsonp (respuesta, devolución de llamada, datos); }}}