如何检查节点是否存在以响应Android中的改造?

时间:2017-08-24 05:14:24

标签: android json nullpointerexception retrofit2

我收到两个针对api请求登录的响应。如果凭据正确,我会得到响应

{
    "name": "Dheepak",
    "email": "Email"
}

如果凭据无效,那么我

{
    "status": "False"
}

我在任何一种情况下得到null poitner exception。我想要的是我想检查我的回复中是否存在名为“status”的字段。我如何检查它?如果它是正常的json那里有使用.has()的规定; 我正在使用改造。请帮助1 !!

以下是回复

 @Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {


    if(response.body().getStatus().equals(null)){
        Toast.makeText(mActivity,"No User Exist",Toast.LENGTH_SHORT).show();


    }else {

        String name = response.body().getName();
        Toast.makeText(mActivity, name, Toast.LENGTH_SHORT).show();
    }

3 个答案:

答案 0 :(得分:2)

单程

optString中使用JSONObject。在onResponse方法中修改。     //在这里编辑,添加到Json

String jsonResponse = new Gson().toJson(result);
// String responseString = response.body().toString();
JSONObject jsonObject = new JSONObject(jsonResponse );
String status = jsonObject.optString("status");
if (TextUtils.isEmpty(status)) {
    Toast.makeText(mActivity, "No User Exist", Toast.LENGTH_SHORT).show();
} else {
    String name = jsonObject.getString("name");
    Toast.makeText(mActivity, name, Toast.LENGTH_SHORT).show();
}

另一种方式

我将JSONObject更改为Map并获得了地图的大小。

然后根据大小,我们可以判断响应。

使用onResponse方法进行编辑。

试试这个

try {
    // edited here ,add toJson
    String jsonResponse = new Gson().toJson(result);
    // String responseString = response.body().toString();
    JSONObject jsonObject = new JSONObject(jsonResponse );
    Map<String, String> map = new HashMap<>();
    Iterator<String> sIterator = jsonObject.keys();
    while (sIterator.hasNext()) {
        // get key
        String key = sIterator.next();
        // get value
        String value = jsonObject.getString(key);
        map.put(key, value);
        System.out.println("key: " + key + ",value:" + value);
    }
    if (map.size() == 1) {
        Toast.makeText(mActivity, "No User Exist", Toast.LENGTH_SHORT).show();
    } else {
        String name = jsonObject.getString("name");
        Toast.makeText(mActivity, name, Toast.LENGTH_SHORT).show();
    }
} catch (JSONException e) {
    e.printStackTrace();
}

答案 1 :(得分:1)

您可以将响应转换为JsonObject,并使用 has()方法确定响应是否具有该特定字段。

                String responseStg=response.body().toString();
                try {
                    JSONObject responseObj= new JSONObject(responseStg);
                    if(responseObj.has("status")){
                      //Something
                    }else{
                      //Something else
                    }    
                }catch (Exception e){

                }

答案 2 :(得分:1)

我知道可能是我迟到了但这里是Retrofit中动态响应的棘手解决方案

<强> 1。创建一个MODEL类或

{
    "name": "Dheepak",
    "email": "Email"
}

<强> 2。为错误创建第二个模型类,即LoginError

{
    "status": "False"
}

第3。定义您的API调用方法,如:

@GET("your url")
Call<Object> getLogin();

最后

  Call<Object> call =  // call here your API and implement CallBack Method

    call.enqueue(new Callback<Object>() {

        @Override
        public void onResponse(Call<Object> call, Response<Object> response) {

            if(response instanceof FIRSTMODELCLASS){
               // your response

           }else{
               // your error 
            }

        }

        @Override
        public void onFailure(Call<Object> call, Throwable t) {

        }
    });