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 服务中列出一份服务即可。

通过错误我猜你的意思是检查是否为空。如果某些字段可能丢失,那么您应该检查。您可以对其进行抽象并为其构建整个基础架构,但是已经有很多工具可以做到这一点。例如,我通常会使用Gson将这个 JSON 解析样板代码移开。创建一个包含所有这些字段的“服务”类,并在Gson. 最重要的是,我将从您的业务逻辑、API 等中移除 JSON 解析(并映射到 POJO)

对于 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 回答