Colchão de fundação
Em Java, existem muitos bibliotecas sobre JSON, como Jackjson, Fastjson, GSON, etc. Eu os usei, mas ainda parece muito pesado para programadores que só precisam fazer o objeto Java retornar uma corda JSON. Além disso, algumas funções são muito personalizáveis. Por exemplo, quando o atributo de um objeto Java está vazio, esses componentes não serão lançados. Portanto, quando percorro o objeto da lista na página, sempre tenho que julgar se esse atributo é indefinido, o que me deixa muito insatisfeito. Então eu decidi reservar algum tempo para estudar o que estava acontecendo.
Mas depois de um olhar de perto uma manhã, descobri que Fastjson e GSON foram escritos de uma maneira muito complicada, e não havia documentos ou comentários relevantes, então finalmente desisti. Então, encontrei um pacote Java relativamente simples que retorna o JSON em www.json.com. Este LIB precisa apenas de 5 aulas de Java, e é exatamente o que eu quero. Deve -se notar que o JSONArray oficial não suporta a conversão direta de Javabeans. Por exemplo, coisas como a lista <suária> não podem ser convertidas. Eles devem ser convertidos em um formato como a lista <Pap> para converter, então eu o modifiquei. Os documentos oficiais incluem:
Deixe -me primeiro apresentar o uso básico.
Use a classe JsonObject para lidar com objetos java básicos, e o uso é aproximadamente o seguinte:
public void testMap () {map <string, object> map = new hashmap <string, object> (); map.put ("nome", "qiu"); map.put ("senha", "123"); map.put ("Endereço", "China"); Usuário do usuário = novo usuário (); user.setUserName ("qiuqiu"); user.setPassword ("123456"); user.getTels (). Add ("123444556677"); user.getTels (). Add ("6893493458585"); map.put ("usuário", usuário); JsonObject json = novo JsonObject (mapa); System.out.println (json.toString ()); } Se for um objeto de coleção, a classe JsonArray é usada e o uso é o seguinte:
public void testlist () lança JSONEXCECCETION {LIST <USUSE> LIST = new ArrayList <suser> (); Usuário do usuário = novo usuário (); user.setUserName ("qiuqiu"); user.setPassword ("123456"); user.getTels (). Add ("123444556677"); user.getTels (). Add ("6893493458585"); Usuário usuário2 = novo usuário (); user2.setUsername ("China"); user2.getTels (). Add ("1234444556677"); user2.getTels (). Add ("6893493458585"); list.add (usuário); list.add (user2); JsonArray JSON = New JsonArray (lista); System.out.println (json.toString (2)); } A partir do código acima, podemos ver que o uso desta lib é bastante simples. Não requer um novo objeto como o GSON, e o design da API da Fastjson também é um pouco irracional. No segundo código acima, há uma toque (2) que indica a saída recuando dois espaços em uma nova linha.
O acima introduz apenas o uso básico, mas não é isso que você deseja. O que você quer é como devolver uma string vazia quando a propriedade do objeto está vazia, em vez de não retornar nada. Embora existam apenas 5 classes, levei duas ou três horas para encontrar o local. Existe um método chamado Populatemap em JsonObject e, no final, há um pequeno pedaço de código:
Resultado de objeto = method.invoke (bean, (objeto []) null); if (resultado! = null) {this.map.put (chave, wrap (resultado)); }Ou seja, quando o método get é chamado e retornado como nulo, essa propriedade não é emitida. Claro, é muito simples mudar:
Resultado de objeto = method.invoke (bean, (objeto []) null); this.map.put (chave, resultado == null? "": wrap (resultado));
Isso finalmente resolveu o problema que eu queria resolver. Obviamente, este Lib é oficialmente trazido por JSON e é escrito de maneira simples. É mais adequado para situações em que existem apenas algumas ou dezenas de dados por vez, como exibição de paginação. Se a quantidade de dados transmitidos por vez for relativamente grande, você poderá considerar o uso do FastJson, etc. Mas eu pessoalmente acho que, para a maioria das ocasiões, a personalização mais necessária é. Por exemplo, se você ocasionalmente encontrar um determinado componente que não possa atender às necessidades, o componente não possui documentação ou comentários, e o código é difícil de entender, que é basicamente o mesmo que não é de código aberto, para que não tenha significado.
Resumo do exemplo
importar java.io.ioException; importar java.io.printwriter; importar javax.servlet.http.httpServletResponse; importação com.alibaba.fastjson.json; Import com.alibaba.fastjson.serializer.SerializerFeature; / ***** O servidor da web retorna a classe de ferramenta JSON* a classe de ferramenta depende da classe Fastjson* Ferramenta suporta retornar dados de formato JSON e JSONP* @Author [email protected]**/ classe pública Responsejsonutils {/ *** *** Destaque o caractere codificando*/ private static string coding = utf-8 "; / *** JSONP Função de retorno de chamada padrão*/ String estática privada retorno de chamada = "retorno de chamada"; /*** Configurações de serialização fastjson*/serializador estático privado [] Recursos = novo serializerfeature [] {// emitir o valor de nulo no mapa serializerfeature.writeMapNullValue, // se o objeto booleano for null, a saída da saída [é falhefature.writenLoLoLoLaLaNasalsfalsfal, a saída da saída. Serializerfeature.writeNullListasEmpty, // Se o número for nulo, a saída é 0 serializerfeature.WritenullNumberSZero, // Saída NULL String serializerfeature.WriteNullStringasEmpty, // formate a data de saída Serializer.WritedEouseUsedEformatAtaty; / *** serialize o objeto java json* @param obj java objeto que requer serialização json* @return json string*/ string estática privada tojSonstring (objeto obj) {return json.tojSonstring (obj, recursos); }/*** Retornar dados do formato json* @param Resposta* @param dados objeto java a ser retornado* @param codificação Retornar o formato de codificação da sequência json*/public static void json (httpServletResponse resposta, dados de string) {// definir o codificação) Response.Setcharacterencoding (codificação); PrintWriter Out = NULL; tente {out = Response.getWriter (); out.write (tojSonstring (dados)); out.flush (); } catch (ioexception e) {e.printStackTrace (); }} / *** Retorne dados do formato JSON, usando a codificação padrão* @param Response* @Param Data Java Objeto a ser retornado* / public static void json (resposta httpSletResponse, dados do objeto) {json (resposta, dados, codificação); } / *** Retorne dados JSONP, usando funções de codificação padrão e retorno de chamada padrão* @param Response* @param dados jsonp dados* / public static void jsonp (httpServletResponse, dados de objeto) {jsonp (resposta, retorno de chamada, codificação); } / *** Retorne dados JSONP, usando o nome da codificação padrão* @param* @param retorno de chamada JSONP Nome da função* @param dados jsonp dados* / public static void jsonp (httpSertletResponse, resposta, dados de recortes, dados do objeto) {jsonp (resposta, retorno de chamada, dados, dados); } / *** Retornar dados JSONP* @param Resposta* @param Retorno de chamada JSONP Nome da função de retorno de chamada* @param dados jsonp dados* @param que codifica dados jsonp* / public static void jsonp (httpServletResponse, resposta de string, dados de string, dados de string) {stringbuffer sb = stringbfr = stringbfr = stringbuff, stringbuff, stringback, dados de string, string) {stringbuffer sb = stringbfr = stringbfr = stringbfr = stringbfr = stringbfr = stringbfr = stringbufs, stringbuff, stringbacks, string de string, string) sb.append ("("); sb.append (tojSonstring (dados)); sb.append (");"); // Defina o formato de codificação Response.SetContentType ("text/plana; charset =" + codificação); Response.Setcharacterencoding (codificação); PrintWriter Out = NULL; tente {out = Response.getWriter (); out.write (sb.toString ()); out.flush (); } catch (ioexception e) {e.printStackTrace (); }} public static string getEncoding () {return coding; } public static void setEncoding (codificação de string) {Responsejsonutils.encoding = coding; } public static string getCallback () {retorna retorno de chamada; } public static void setCallback (string de retorno) {Responsejsonutils.callback = retorno de chamada; }}
/*** Retorne dados json em servlet*/@webServlet ("/json.do") classe pública JSOnservlet estende httpServlet {private estático final serialversionuid = 7500835936131982864L; / *** Retorne dados do formato json*/ serviço void protegido (solicitação httpServLeTrequest, httpServletResponse resposta) lança servletexception, ioexception {map <string, object> data = new hashmap <string, object> (); data.put ("date", new Date ()); data.put ("email", "[email protected]"); data.put ("idade", 30); data.put ("nome", "csdn"); data.put ("Array", new int [] {1,2,3,4}); Respostajsonutils.json (resposta, dados); }} /*** servlet retorna dados de formato jsonp*/@webServlet ("/jsonp.do") Classe pública jsonPervlet estende httpServlet {private estático final serialversionuid = -8343408864035108293l; /*** A solicitação enviará o parâmetro de retorno de chamada como uma função de retorno de chamada. Se o parâmetro de retorno de chamada não for enviado, a função de retorno de chamada padrão será usada*/serviço de vazio protegido (solicitação HTTPSERVletRequest, resposta httpServletResponse) lança servletexception, ioexception {// a função de retorno de chamada enviada pelo cliente String de string = request.GetParameter ("callback"); Mapa <string, object> data = new hashmap <string, object> (); data.put ("date", new Date ()); data.put ("email", "[email protected]"); data.put ("idade", 30); data.put ("nome", "csdn"); data.put ("Array", new int [] {1,2,3,4}); if (retorno de chamada == NULL || Callback.Length () == 0) {// Se o cliente não enviar uma função de retorno de chamada, use a função de retorno de chamada padrão, respostajsonutils.jsonp (resposta, dados); } else {// use a função de retorno de chamada do cliente Responsejsonutils.jsonp (resposta, retorno de chamada, dados); }}}} / ** * Return json e jsonp em struts2 */ classe pública jsonaction estende o ACTIONSupport {private estático final serialversionuid = 5391000845385666048L; / *** Função de retorno de chamada JSONP*/ Retorno de chamada de String Private; / ** * Return json */ public void json () {httpServletResponse Response = servletActionContext.getResponse (); Mapa <string, object> data = new hashmap <string, object> (); data.put ("date", new Date ()); data.put ("email", "[email protected]"); data.put ("idade", 30); data.put ("nome", "csdn"); data.put ("Array", new int [] {1,2,3,4}); Respostajsonutils.json (resposta, dados); } / ** * Retorne jsonp * / public void jsonp () {httpServletResponse resposta = servletActionContext.getResponse (); Mapa <string, object> data = new hashmap <string, object> (); data.put ("date", new Date ()); data.put ("email", "[email protected]"); data.put ("idade", 30); data.put ("nome", "csdn"); data.put ("Array", new int [] {1,2,3,4}); if (retorno de chamada == NULL || Callback.Length () == 0) {// Se o cliente não enviar uma função de retorno de chamada, use a função de retorno de chamada padrão, respostajsonutils.jsonp (resposta, dados); } else {// use a função de retorno de chamada do cliente Responsejsonutils.jsonp (resposta, retorno de chamada, dados); }} public string getCallback () {retorna retorno de chamada; } public void setCallback (string de retorno) {this.callback = chamada de chamada; }} importar org.springframework.steretype.controller; importar org.springframework.web.bind.annotation.requestmapping; /*** Spring MVC retorna JSON e JSONP DATOS*/@CONTROLLER @ReQuestMapping ("/json") classe pública JSONCONTROLLER {/*** Return JSON Data* @param request* @param Response*/@ReQuestMapping ("/json.do") Void public json (HTSTRSVELTRETRETRETRETLETREQUENTETRETLETLETLETLETLETLETLETLETLETLETLETLETLETLETLETLETLETLETLETLETLETLOTMETLOTMETLOTMETLOTMETLOTMETLOTMETLOTMETLOTMETLOTMETLEMPROTMETL) dados = novo hashmap <string, object> (); data.put ("date", new Date ()); data.put ("email", "[email protected]"); data.put ("idade", 30); data.put ("nome", "csdn"); data.put ("Array", new int [] {1,2,3,4}); Respostajsonutils.json (resposta, dados); }/*** Retornar dados JSONP* @param Retorno de chamada JSONP Função de retorno de chamada* @param solicitação* @param Resposta*/@RequestMapping ("/jsonp.do") public void json (string de chamada, httpServleTrequest solicitação, httpSleTroPonse, resposta) {map <string, objeto> dados> Dados = Dados = Datas = HashhtMerMervErSponse, objeto data.put ("date", new Date ()); data.put ("email", "[email protected]"); data.put ("idade", 30); data.put ("nome", "csdn"); data.put ("Array", new int [] {1,2,3,4}); if (retorno de chamada == NULL || Callback.Length () == 0) {// Se o cliente não enviar uma função de retorno de chamada, use a função de retorno de chamada padrão, respostajsonutils.jsonp (resposta, dados); } else {// use a função de retorno de chamada do cliente Responsejsonutils.jsonp (resposta, retorno de chamada, dados); }}}