ファンデーションマットレス
Javaでは、Jackjson、Fastjson、GSONなど、JSONについて多くのLibsが使用されています。さらに、一部の関数は非常にカスタマイズ可能です。たとえば、Javaオブジェクトの属性が空の場合、これらのコンポーネントは出力されません。したがって、ページ上のリストオブジェクトをループすると、この属性が未定義であるかどうかを常に判断する必要があります。それで、私は何が起こっているのかを研究するために少し時間がかかることにしました。
しかし、朝をよく見た後、FastjsonとGSONの両方が非常に複雑な方法で書かれていることがわかりました。関連する文書やコメントはなかったので、ついにあきらめました。そこで、www.json.comでJSONを返す比較的単純なJavaパッケージを見つけました。このLIBは、実行するのに5つのJavaクラスしか必要ありません。これがまさに私が望むものです。公式のJsonArrayは、Javabeansの直接変換をサポートしていないことに注意する必要があります。たとえば、list <user>などのものを変換することはできません。それらは、list <map>のような形式に変換して変換する必要があるため、変更しました。公式文書には次のものがあります。
最初に基本的な使用法を紹介します。
jsonObjectクラスを使用して基本的なJavaオブジェクトを処理すると、使用法は次のとおりです。
public void testmap(){map <string、object> map = new hashmap <string、object>(); map.put( "name"、 "qiu"); map.put( "password"、 "123"); map.put( "アドレス"、 "中国"); user user = new user(); user.setUsername( "qiuqiu"); user.setPassWord( "123456"); user.gettels()。追加( "123444556677"); user.gettels()。add( "6893493458585"); map.put( "user"、user); jsonobject json = new jsonobject(map); system.out.println(json.toString()); }コレクションオブジェクトの場合、JSonArrayクラスが使用され、使用法は次のとおりです。
public void testlist()throws jsonexception {list <user> list = new arraylist <user>(); user user = new user(); user.setUsername( "qiuqiu"); user.setPassWord( "123456"); user.gettels()。追加( "123444556677"); user.gettels()。add( "6893493458585"); user user2 = new user(); user2.setusername( "china"); user2.gettels()。add( "1234444556677"); user2.gettels()。add( "6893493458585"); list.add(user); list.add(user2); jsonarray json = new jsonarray(list); system.out.println(json.tostring(2)); }上記のコードから、このLIBの使用が非常に簡単であることがわかります。 GSONのような新しいオブジェクトは必要ありません。FastJsonのAPIデザインもやや不合理です。上記の2番目のコードには、新しいラインの2つのスペースをインデントすることで出力を示すToString(2)があります。
上記は基本的な使用法を導入するだけですが、これはあなたが望むものではありません。あなたが望むのは、オブジェクトプロパティが空であるときに空の文字列を返す方法です。クラスは5つしかありませんが、その場所を見つけるのに2、3時間かかりました。 jsonobjectにはpopulatemapという方法があり、最後に小さなコードがあります。
オブジェクトresult = method.invoke(bean、(object [])null); if(result!= null){this.map.put(key、wrap(result)); }つまり、GETメソッドが呼び出され、nullとして返される場合、このプロパティは出力ではありません。もちろん、変更するのは非常に簡単です:
オブジェクトresult = method.invoke(bean、(object [])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をインポートします。 / **** WebサーバーはJSONツールクラスを返します*ツールクラスはFastJSONに依存します*ツールクラスはJSONおよびJSONP形式のデータを返すことをサポートします* @Author [email protected]**/ public class ResponseJSonutils {/ ***デフォルト文字エンコード*/ private Static String encoding = "UTF-8"; / *** JSONPデフォルトのコールバック関数*/ private static string callback = "callback"; /*** FASTJSON Serialization Settings*/Private Static SerializerFeature [] feature = new SerializerFeature [] {// MAP SerializerFeature.WriteMapNullValueにnullの値を出力します。 serializerfeature.writenulllistasempty、//番号がnullの場合、出力は0 serializerfeature.writenullnumberaszero、// output null string serializerfeature.writenullstringasempty、// output date serializerfeature.writedatedateformat}; / *** JavaオブジェクトJSON* @Param OBJ JavaオブジェクトJSON Serialization* @return json String*/ private static string tojsonstring(object obj){return json.tojsonstring(obj、feature); }/*** jsonフォーマットデータを返します* @param response* @param data javaオブジェクトは返されます* @paramエンコーディングjson文字列のエンコード形式*/public static void json(httpservletresponse応答、オブジェクトデータ、文字列エンコーディング){//エンコーディングフォーマット応答の設定。 Response.setcharacterencoding(エンコード); printwriter out = null; try {out = response.getWriter(); out.write(tojsonstring(data)); out.flush(); } catch(ioexception e){e.printstacktrace(); }} / *** json形式のデータを返し、デフォルトのエンコードを使用します* @param応答* @param data javaオブジェクトは返されます* / public static void json(httpservletresponse応答、オブジェクトデータ){json(応答、データ、エンコーディング); } / *** jsonPデータを返し、デフォルトのエンコードおよびデフォルトのコールバック関数を使用して* @param Response* @param data jsonp data* / public static void jsonp(httpservletresponse応答、オブジェクトデータ){jsonp(response、callback、data、encoding); } / *** jsonpデータを返し、デフォルトのエンコード* @param応答* @paramコールバックjsonpコールバックname* @param data jsonp data* / public static void jsonp(httpservletresponse応答、文字列コールバック、オブジェクトデータ){jsonp(response、callback、data、encoding); } / *** jsonp dataを返します* @param応答* @paramコールバックJSONPコールバック関数名* @param Data jsonp data* @param encoding jsonp data* / public static void jsonp(httpservletresponse response、string callback、object data、string encoding) sb.append( "("); sb.append(tojsonstring(data)); sb.append( ");"); //エンコード形式のresponse.setContentType( "Text/Plain; charset =" + encoding)を設定します。 Response.setcharacterencoding(エンコード); printwriter out = null; try {out = response.getWriter(); out.write(sb.toString()); out.flush(); } catch(ioexception e){e.printstacktrace(); }} public static string getEncoding(){return encoding; } public static void setEncoding(string encoding){responsjsonutils.encoding = encoding; } public static string getCallback(){return callback; } public static void setCallback(string callback){responsjsonutils.callback = callback; }}
/***サーブレットのjsonデータを返す*/@webservlet( "/json.do")public class jsonservletはhttpservlet {private static final long serialversionuid = 7500835936131982864l; / *** JSONフォーマットデータを返します*/保護されたvoidサービス(httpservletrequest request、httpservletResponse応答)スローservletexception、ioexception {map <string、object> data = new hashmap <string、object>(); data.put( "date"、new date()); data.put( "email"、 "[email protected]"); data.put( "age"、30); data.put( "name"、 "csdn"); data.put( "array"、new int [] {1,2,3,4}); Responsejsonutils.json(Response、data); }} /** SERVLET RETURNS JSONP FORMAT DATA*/@WEBSERVLET( "/JSONP.DO")パブリッククラスJSONPSERVLET拡張httpservlet {private static final long serialversionuid = -8343408864035108293l; /***リクエストは、コールバックパラメーターをコールバック関数として送信します。コールバックパラメーターが送信されない場合、デフォルトのコールバック関数が使用されます*/保護されたvoidサービス(httpservletrequestリクエスト、httpservletresponse応答)は、servletexception、ioexception {//クライアント文字列callback = request.getparameter( "callback"); map <string、object> data = new hashmap <string、object>(); data.put( "date"、new date()); data.put( "email"、 "[email protected]"); data.put( "age"、30); data.put( "name"、 "csdn"); data.put( "array"、new int [] {1,2,3,4}); if(callback == null || callback.length()== 0){//クライアントがコールバック関数を送信しない場合、デフォルトのコールバック関数responsejsonutils.jsonp(respons、data)を使用します。 } else {//クライアントのコールバック関数responsejsonutils.jsonp(respons、callback、data)を使用します。 }}}} / ** * struts2のjsonとjsonpを返します */ public class jsonaction extends actionsupport {private static final long serialversionuid = 5391000845385666048l; / *** JSONPコールバック関数*/プライベート文字列コールバック。 / ** * return json */ public void json(){httpservletResponse response = servletactionContext.getResponse(); map <string、object> data = new hashmap <string、object>(); data.put( "date"、new date()); data.put( "email"、 "[email protected]"); data.put( "age"、30); data.put( "name"、 "csdn"); data.put( "array"、new int [] {1,2,3,4}); Responsejsonutils.json(Response、data); } / ** * return jsonp * / public void jsonp(){httpservletResponse response = servletactionContext.getResponse(); map <string、object> data = new hashmap <string、object>(); data.put( "date"、new date()); data.put( "email"、 "[email protected]"); data.put( "age"、30); data.put( "name"、 "csdn"); data.put( "array"、new int [] {1,2,3,4}); if(callback == null || callback.length()== 0){//クライアントがコールバック関数を送信しない場合、デフォルトのコールバック関数responsejsonutils.jsonp(respons、data)を使用します。 } else {//クライアントのコールバック関数responsejsonutils.jsonp(respons、callback、data)を使用します。 }} public string getCallback(){return callback; } public void setCallback(string callback){this.callback = callback; }} org.springframework.stertype.controllerをインポートします。 org.springframework.web.bind.annotation.requestmappingをインポートします。 /*** Spring MVCはJSONおよびJSONPデータを返します*/@Controller @RequestMapping( "/json")Public Class JSonController {/*** @Param Request* @Param Response*/@RequestMapping( "/json.do")Public ribed json(httpserreletreletreletretreest json( "/json.do") object> data = new Hashmap <String、object>(); data.put( "date"、new date()); data.put( "email"、 "[email protected]"); data.put( "age"、30); data.put( "name"、 "csdn"); data.put( "array"、new int [] {1,2,3,4}); Responsejsonutils.json(Response、data); }/*** jsonp data* @paramコールバックjsonpのコールバック関数* @param request* @param response*/@requestmapping( "/jsonp.do")public void json(string callback、httpservletrequest request、httpservletresponse応答) data.put( "date"、new date()); data.put( "email"、 "[email protected]"); data.put( "age"、30); data.put( "name"、 "csdn"); data.put( "array"、new int [] {1,2,3,4}); if(callback == null || callback.length()== 0){//クライアントがコールバック関数を送信しない場合、デフォルトのコールバック関数responsejsonutils.jsonp(respons、data)を使用します。 } else {//クライアントのコールバック関数responsejsonutils.jsonp(respons、callback、data)を使用します。 }}}