0

私は空き時間に構築しているアプリケーションを持っており、REST API に接続しています。正常に動作していますが、これが JSON エラーをチェックする「適切な」方法であるかどうかはわかりません。JSON のエラーをチェックする最も効率的で信頼できる方法を探しています。私は JSON の理解を深めようとしていますが、そうでない場合は最善の方法でやっているとは思いたくありません。これは、JSON を介して約 20 項目の応答を処理するための最良の方法ですか?

更新 一部の応答には結果がない可能性があることを忘れていました。それが、私がこの質問をしている理由でもあります。

スニペットこれは通常どのように行われますか?

if (serving.isNull("calories")) {
    mCalories = null;
} else {
    mCalories = serving.getString("calories");
}

コードとその応答の一部から、ほとんどの文字列を削除しました。

private void getFood(final long id) {
    new AsyncTask<String, String, String>() {
        @Override
        protected String doInBackground(String... arg0) {
            JSONObject foodGet = mFatSecretGet.getFood(id);
            try {
                if (foodGet != null) {
                    mFoodName = foodGet.getString("food_name");
                    JSONObject servings = foodGet.getJSONObject("servings");
                    Object intervention = servings.get("serving");
                    if (intervention instanceof JSONObject) {
                        arrayOrJson = "object";
                        JSONObject serving = servings.getJSONObject("serving");
                        if (serving.isNull("calories")) {
                            mCalories = null;
                        } else {
                            mCalories = serving.getString("calories");
                        }
                        if (serving.isNull("fat")) {
                            mFat = null;
                        } else {
                            mFat = serving.getString("fat");
                        }
                        if (serving.isNull("carbohydrate")) {
                            mCarbohydrates = null;
                        } else {
                            mCarbohydrates = serving.getString("carbohydrate");
                        }
                        if (serving.isNull("protein")) {
                            mProtein = null;
                        } else {
                            mProtein = serving.getString("protein");
                        }
                        /**
                         * Removed Data
                         */
                    } else if (intervention instanceof JSONArray) {
                        mItem.clear();
                        JSONArray serving = servings.getJSONArray("serving");
                        for (int i = 0; i < serving.length(); i++) {
                            JSONObject ser = serving.getJSONObject(i);
                            String DifferentServings = ser.getString("serving_description");
                            mItem.add(DifferentServings);
                        }
                        JSONObject newServing = serving.getJSONObject(mLastSpinnerPosition); // Returning the spinner position. 
                        if (newServing.isNull("serving_description")) {
                            mServingDescription = null;
                        } else {
                            mServingDescription = newServing.getString("serving_description");
                        }
                        if (newServing.isNull("calories")) {
                            mCalories = null;
                        } else {
                            mCalories = newServing.getString("calories");
                        }
                        if (newServing.isNull("fat")) {
                            mFat = null;
                        } else {
                            mFat = newServing.getString("fat");
                        }
                        if (newServing.isNull("carbohydrate")) {
                            mCarbohydrates = null;
                        } else {
                            mCarbohydrates = newServing.getString("carbohydrate");
                        }
                        if (newServing.isNull("protein")) {
                            mProtein = null;
                        } else {
                            mProtein = newServing.getString("protein");
                        }
                        /**
                         * Removed Data
                         */                         
                    }
                }
            } catch (JSONException exception) {
                exception.printStackTrace();
                return "Error";
            }
            return "";
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            servingAdapter.notifyDataSetChanged();
            setItems();
            saveMeal();
        }
    }.execute();
}
4

1 に答える 1

0

この例では、DRY 原則に違反する重複コードが多数あります。サービングのリストに対して、特別なケースとして機能するものをモデル化しているからだと思います。REST サービスで 1 つのサービスを提供するリストにするだけです。

エラーによって、null かどうかをチェックするつもりだったと思います。一部のフィールドが欠落している可能性がある場合は、確認する必要があります。それを抽象化してインフラストラクチャ全体を構築することもできますが、それを行うツールはすでにたくさんあります。私は通常、たとえばGsonを使用して、この JSON 解析ボイラー プレート コードを移動しています。これらすべてのフィールドを含む「サービス提供」クラスを作成し、 を使用してこのクラスのシリアライズとデシリアライズを行いますGson。要するに、JSON 解析 (および POJO へのマッピング) をビジネス ロジックや API などから遠ざけます。

Gson の場合、単純なユーティリティ クラスを考え出すことができます。

public class GsonUtil {

    private static final Gson gson;

    static {
        gson = new GsonBuilder().create();
    }

    private GsonUtil() {}

    public static String toJson(Object obj){
        return gson.toJson(obj);
    }

    public static <T> T fromJson(String json, Class<T> classOfT){
        return gson.fromJson(json, classOfT);
    }       
}  

Gsonカスタムシリアライザーとデシリアライザーを実装するためのインフラストラクチャも提供しますが、あなたの場合はそれがなくても機能するはずです。

REST サービスからエラーが発生した場合は、HTTP 応答コードでモデル化し、対応するデータ転送オブジェクト (DTO) を追加して、必要に応じてエラー メッセージとエラー コードを表示できます。

于 2015-04-22T03:47:29.337 に答える