Android 必须通过JSON检查每个响应项
我有一个基于空闲时间构建的应用程序,并将其连接到RESTAPI。它工作正常,但我不确定这是否是检查JSON错误的正确方法。我正在寻找最有效、最可靠的方法来检查JSON中的错误。我正在努力提高我对JSON的理解,如果不是这样,我不想认为我是在用最好的方式来做。这是通过JSON处理大约20项响应的最佳方法吗 更新 我忘了提到一些回答可能没有结果。这也是我提出这个问题的原因 代码片段通常是这样做的吗Android 必须通过JSON检查每个响应项,android,json,jsonexception,Android,Json,Jsonexception,我有一个基于空闲时间构建的应用程序,并将其连接到RESTAPI。它工作正常,但我不确定这是否是检查JSON错误的正确方法。我正在寻找最有效、最可靠的方法来检查JSON中的错误。我正在努力提高我对JSON的理解,如果不是这样,我不想认为我是在用最好的方式来做。这是通过JSON处理大约20项响应的最佳方法吗 更新 我忘了提到一些回答可能没有结果。这也是我提出这个问题的原因 代码片段通常是这样做的吗 if (serving.isNull("calories")) { mCalories = n
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();
}
在本例中,有许多重复代码违反了DRY原则。我认为这是因为你把一个模型作为一个特例,而不是一份服务清单。只要把它列在一个清单上,在你的休息服务中有一个服务 我猜您所说的错误是指检查是否为null。如果某些字段可能丢失,则应进行检查。您可以对其进行抽象,并为其构建整个基础设施,但有很多工具已经做到了这一点。 我通常通过使用示例来移动这个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,以便在需要时显示错误消息和错误代码