如何在JSON中获取特定元素?

时间:2017-07-20 03:33:26

标签: android json

如果我有如下的JSON:

{
  "Division": [
      {
        "DivisionId": 1,
        "DivisionName" : "A"
      },
      {
        "DivisionId": 2,
        "DivisionName" : "B"
      }
  ],
 "Title": [
     {
       "TitleId": 11,
       "Title": "Title 1"
     },
     {
       "TitleId": 12,
       "Title": "Title 2"
     }
  ]
}

如何才能获得Division内部的值?我想要实现的是将Division的值放在我的ArrayList中。我使用Volley获取JSON结果,我尝试了onResponse我使用的JSONArray divisionArr = response.getJSONArray("Division");并在此处循环我的代码

 JSONArray divisionArr = response.getJSONArray("Division");

                for (int i = 0; i < divisionArr.length(); i++) {
                    Division division = new Division();
                    JSONObject divisionObj = (JSONObject) divisionArr.get(i);

                    division.setId(divisionObj.getInt("DivisionId"));
                    division.setName(divisionObj.getString("DivisionName"));

                    divisionArrayList.add(division);
                }

但我有错误ParseError,我可能做错了,但我不知道它是什么。请帮忙,谢谢。

/////// 这是我的Volley request

public void getData(Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {

    try{

        String syncCall = Constants.VOLLEY;

        request = new JsonObjectRequest(Method.GET,
                syncCall,
                null,
                listener,
                errorListener);

        request.setRetryPolicy(
                new DefaultRetryPolicy(
                        60000,//DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, // 2500
                        1,//DefaultRetryPolicy.DEFAULT_MAX_RETRIES, // 1
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); //1f

        mRequestQueue.add(request);
    } catch (Exception e) {
        e.printStackTrace();
    }
} 

然后在我的活动中

  private void callSyncVolley() {

    final ProgressDialog pd = new ProgressDialog(this);
    pd.setMessage("Fetching data....");
    pd.show();

    Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray divisionArr = response.getJSONArray("Division");

                for (int i = 0; i < divisionArr.length(); i++) {
                    Division division = new Division();
                    JSONObject divisionObj = (JSONObject) divisionArr.get(i);

                    division.setId(divisionObj.getInt("DivisionId"));
                    division.setName(divisionObj.getString("DivisionName"));

                    divisionArrayList.add(division);
                }

                pd.dismiss();

            } catch (JSONException e) {
                e.printStackTrace();
                Log.e(TAG, "Error: " + e.getMessage());
                pd.dismiss();
            }
        }
    };

    Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

            if (error.networkResponse != null) {
                Log.d(TAG, "Error Response code: " + error.networkResponse.statusCode);
                pd.dismiss();
            }
            if (error instanceof TimeoutError || error instanceof NoConnectionError) {
                Log.d(TAG, "Error Response code: Timeout/NoConnection");
                pd.dismiss();
            } else if (error instanceof AuthFailureError) {
                //TODO
                Log.d(TAG, "Error Response code: AuthFailureError");
                pd.dismiss();
            } else if (error instanceof ServerError) {
                //TODO
                Log.d(TAG, "Error Response code: ServerError");
                pd.dismiss();
            } else if (error instanceof NetworkError) {
                //TODO
                Log.d(TAG, "Error Response code: NetworkError");
                pd.dismiss();
            } else if (error instanceof ParseError) {
                //TODO
                Log.d(TAG, "Error Response code: ParseError");
                pd.dismiss();
            }
        }
    };

    VolleyRequestManager.getInstance().doRequest().getData(listener, errorListener);
}

错误仅显示Error Response code: ParseError

4 个答案:

答案 0 :(得分:1)

您可以尝试这样做,如果您尝试使用<label>它将获得值或null,因此您可以检查进一步生成

get and opt type

  
      
  • 使用getType()检索强制值。如果请求的名称没有值或值,则会因JSONException而失败   不能强制要求的类型。
  •   
  • 使用optType()检索可选值。如果请求的名称没有值或者是,则返回系统或用户提供的默认值   值无法强制转换为请求的类型。
  •   

实施例: getJSONArray - 返回按名称映射的值,如果它存在且是JSONArray,否则抛出。所以我们无法处理它将尝试阻塞的即将到来的代码行,

但是optJSONArray - 返回按名称映射的值(如果它存在且是JSONArray),否则返回null。所以使用该null值我们可以轻松处理代码

@click.capture.stop.prevent="toggleNextOrder(item.id)"

答案 1 :(得分:1)

您的JSON格式无效,

{
  "Division": [
      {
        "DivisionId": 1,
        "DivisionName" : A
      },
      {
        "DivisionId": 2,
        "DivisionName" : B
      }
  ],
 "Title": [
     {
       "TitleId": 11,
       "Title": "Title 1"
     },
     {
       "TitleId": 12,
       "Title": "Title 2"
     }
  ],
}

我刚刚粘贴了您的格式here

  1. divisionArr.setName(divisionObj.getString("DivisionName"));&amp;&amp;
  2. 您正在尝试访问未用双引号括起来的字符串,字符串A和字符串B未包含在双引号中。

    1. 数组末尾不必要的逗号],

答案 2 :(得分:0)

而不是Volley使用Retrofit因为它会单独为你提供每个JSON元素。要了解如何使用Retrofit,请检查此tutorial

答案 3 :(得分:0)

我终于做对了,我重新整理了一切,检查了我的json结果,这是我的代码

Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

            try {

                JSONArray divisionArr = response.getJSONArray("Division");

                if(!divisionArr.equals(null)){
                    for(int i = 0; i < divisionArr.length(); i++){
                        Division division = new Division();
                        JSONObject divisionObj = (JSONObject) divisionArr.get(i);

                        division.setId(divisionObj.getInt("DivisionId"));
                        division.setName(divisionObj.getString("DivisionName"));

                        divisionList.add(division);
                    }
                }

                pd.dismiss();

            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(),
                        e.getMessage(), Toast.LENGTH_SHORT).show();
                pd.dismiss();
            }

        }
    };