[解決済み] RetrofitでDynamic JSONを扱うには?
質問
retrofit efficient networking libraryを使用していますが、単一の接頭辞を含むDynamic JSONを扱うことができません。
responseMessage
という接頭辞があり、それが
object
ランダムに、同じ接頭辞(
responseMessage
) が String に変わる場合があります (動的に)。
responseMessageのJson形式のObject。
{
"applicationType":"1",
"responseMessage":{
"surname":"Jhon",
"forename":" taylor",
"dob":"17081990",
"refNo":"3394909238490F",
"result":"Received"
}
}
responseMessage
Json形式は動的に文字列に変更されます。
{
"applicationType":"4",
"responseMessage":"Success"
}
私の問題は、retrofit には組み込みの
JSON
をパースするので、リクエストごとにひとつの POJO を割り当てなければなりません。
JSON
レスポンスで構築されています。の両方でプレフィックスが文字列からオブジェクトにランダムに変更されます。
成功(...)
と
failure(...)
メソッドがあります!
void doTrackRef(Map<String, String> paramsref2) {
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("http://192.168.100.44/RestDemo").build();
TrackerRefRequest userref = restAdapter.create(TrackerRefRequest.class);
userref.login(paramsref2,
new Callback<TrackerRefResponse>() {
@Override
public void success(
TrackerRefResponse trackdetailresponse,
Response response) {
Toast.makeText(TrackerActivity.this, "Success",
Toast.LENGTH_SHORT).show();
}
@Override
public void failure(RetrofitError retrofitError) {
Toast.makeText(TrackerActivity.this, "No internet",
Toast.LENGTH_SHORT).show();
}
});
}
ポジョ
public class TrackerRefResponse {
private String applicationType;
private String responseMessage; //String type
//private ResponseMessage responseMessage; //Object of type ResponseMessage
//Setters and Getters
}
上記のコードでは、POJO TrackerRefResponse.java のプレフィックス responseMessage が string または responseMessage 型のオブジェクトに設定されているので、同じ名前の ref 変数で POJO を作成できます (java 基本 :) ) ので、動的にも同じソリューションを探しているところです。
JSON
をRetrofitで使えるようにしたいのです。
通常のhttpクライアントでは非同期タスクで簡単にできることですが、REST-APIではベストプラクティスではありません。
JSON
をパースすることです!パフォーマンスを見ると
ベンチマーク
いつもVolleyかRetrofitがベストチョイスなんですが、ハンドルダイナミックに失敗してます。
JSON
!
私が知っている可能な解決策
-
httpクライアントのパースで古いasycタスクを使用する :(
-
RESTapiバックエンドの開発者を説得してみる。
-
カスタムRetrofitクライアントを作成する :)
どのように解決するのですか?
遅ればせながら、コンバータを使用するとよいでしょう。
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://graph.facebook.com")
.setConverter(new DynamicJsonConverter()) // set your static class as converter here
.build();
api = restAdapter.create(FacebookApi.class);
そして、retrofitのConverterを実装した静的なクラスを使用します。
static class DynamicJsonConverter implements Converter {
@Override public Object fromBody(TypedInput typedInput, Type type) throws ConversionException {
try {
InputStream in = typedInput.in(); // convert the typedInput to String
String string = fromStream(in);
in.close(); // we are responsible to close the InputStream after use
if (String.class.equals(type)) {
return string;
} else {
return new Gson().fromJson(string, type); // convert to the supplied type, typically Object, JsonObject or Map<String, Object>
}
} catch (Exception e) { // a lot may happen here, whatever happens
throw new ConversionException(e); // wrap it into ConversionException so retrofit can process it
}
}
@Override public TypedOutput toBody(Object object) { // not required
return null;
}
private static String fromStream(InputStream in) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder out = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
out.append(line);
out.append("\r\n");
}
return out.toString();
}
}
このサンプルコンバータは、JsonレスポンスをString, Object, JsonObject, Map< String, Object >のいずれかで返すように書きました。もちろん、すべての返り値がすべてのJsonに対して機能するわけではありませんし、改善の余地もあります。しかし、これは、コンバータを使用して、ほとんどすべてのレスポンスを動的なJsonに変換する方法を示しています。
関連
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] JSONをC#のダイナミックオブジェクトにデシリアライズする?
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Android APKファイルの中身を見るには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Androidネットワークライブラリの比較。OkHTTP、Retrofit、Volley [終了しました]。
-
[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。
-
[解決済み] HttpPostによる画像送信
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] EclipseのAndroidプロジェクトにライブラリ/JARを追加する
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] PendingIntentの "requestCode "は何に使うのですか?
-
[解決済み] LayoutParamsの高さを密度に依存しないピクセル数でプログラム的に設定する。
-
[解決済み] ViewPager2でスワイプを無効にするには?
-
[解決済み] Google Play ストア内部テストのロールアウトが開始できない