序文
実際の開発プロジェクトでは、サーバーは多くの場合、空の文字列「」を使用して、returnの結果として空の値を表しますが、GSONで問題が発生します。このデータのタイプが文字列ではない場合、GSONはそれを解析するときにエラーを報告します。
JSON例外
まずバックグラウンドで返されたJSONを見てみましょう
通常の状況下でJSON:
{"code":0、 "msg": "ok"、 "data":{"id":5638、 "NewsID":5638}}データパーツに対応するエンティティクラス:
パブリッククラスjsonbean {private int id; Private int NewsID; public int getid(){return id; } public void setid(int id){this.id = id; } public int getNewsid(){return NewsID; } public void setnewsid(int newsid){this.newsid = newsID; }}例外JSON (対応するデータは、バックグラウンドデータベースNewsIDフィールドにはありません):
{"code":0、 "msg": "ok"、 "data":{"id":5638、 "newsid": ""}}このようにして、GSONは解析時に解析エラーで例外をスローし、アプリは ""をintに変換できないためにクラッシュします
JSON例外の処理
バックグラウンドで返されたJSON例外を正常に解析できる場合、対応するNULL値は次のようなデフォルト値に変換されると予想していますnewsId=0;
ここでは、バックグラウンド開発者が出力するときにあなたのための修正を除外しますが、私たちはまだ自分自身に頼らなければなりません -
GSONのJsonSerializer<T>インターフェイスとJsonDeserializer<T> 、つまり、シリアル化と脱介入インターフェイスを実装する必要があるINT値の型コンバーターを書きます。
Public Class IntegerDefault0Adapterはjsonserializer <integer>、jsondeserializer <integer> {@override public integer deserialize(jsonelement json、type typeoft、jsonderializationcontextコンテキスト)をスローします。 json.getAsstring()。equals( "null")){// intタイプとして定義します。 }} catch(Exception Ingrore){} try {return json.getasint(); } catch(numberformatexception e){新しいjsonsyntaxexception(e); }} @Override public jsonelement serialize(integer src、type typeofsrc、jsonserializationcontext context){return new jsonprimitive(src); }}同様に、長いタイプとダブルタイプ
double =>
パブリッククラスのdoubledefault0Adapterはjsonserializer <double>、jsondeserializer <double> {@Override public double Deserialize(jsonelement json、type typeoft、jsonderializationcontextコンテキスト)をスローしますjsonparseexception {try {if(json.getasstring()。 json.getAsstring()。equals( "null")){//背景が ""またはnullを返す場合、ダブルタイプとして定義するには、0.00を返します0.00; }} catch(Exception Ingrore){} try {return json.getasDouble(); } catch(numberformatexception e){新しいjsonsyntaxexception(e); }} @Override public jsonelement serialize(double src、type typeofsrc、jsonserializationcontext context){return new jsonprimitive(src); }}long =>
パブリッククラスのlongdefault0Adapterはjsonserializer <long>、jsondeserializer <long> {@override public long deserialize(jsonelement json、type typeoft、jsonderializationcontextコンテキスト)をスローしますjsonparseexception {try {try {if(json.getasstring()。 json.getAsstring()。equals( "null")){//背景が ""またはnullを返す場合、長いタイプとして定義します。 }} catch(Exception Ingrore){} try {return json.getaslong(); } catch(numberformatexception e){新しいjsonsyntaxexception(e); }} @Override public jsonelement serialize(long src、type typeofsrc、jsonserializationcontextコンテキスト){return new jsonprimitive(src); }}したがって、使用は次のようです:
new retrofit.builder().client(okhttpclient)//ネットワークアクセスframework.addconverterfactory(gsonconverterfactory.create(buildgson()))// add json変換フレームワーク(rxjavacalladapterory.create.creotit()// letサポートrxjava.baseurl(baseurl).build();/** *バックグラウンドに ""と "null"の処理を追加 * 1.int => 0 * 2.Double => 0.00 * 3.Long => 0L * * @return */public Static Gson BuildGson(){(gson == null){gson = new gsonbuilder .registertypeadapter(integer.class、new integerdefault0Adapter()).registertypeadapter(int.class、new IntegerDefault0Adapter()).RegisterTyPeadapter(double.class、new doubledefault0Adapter().registertypeadapter(long。 .registertypeadapter(long.class、new longdefault0Adapter()).create(); } return gson;}バックグラウンドJSONフィールドが再び空になっているので、決してクラッシュしません
要約します
上記は、この記事のコンテンツ全体です。この記事の内容が、すべての人の勉強や仕事に役立つことを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。