【问题标题】:Android Studio: How to parse a JSON Object from Inside of a JSON Array?Android Studio:如何从 JSON 数组内部解析 JSON 对象?
【发布时间】:2019-01-07 19:12:18
【问题描述】:

我正在尝试将以下 JSON 数据解析为回收站视图。特别是我想解析地址对象以显示locationName、line1、city、state和zip,但是我无法正确解析方法。

   {
 "pollingLocations": [
  {
   "address": {
    "locationName": "LITTLE LEAGUE HEADQUARTERS",
    "line1": "6707 LITTLE LEAGUE DR",
    "city": "SAN BERNARDINO",
    "state": "CA",
    "zip": "92407"
   },
   "notes": "",
   "pollingHours": "07:00-20:00",
   "sources": [
    {
     "name": "Voting Information Project",
     "official": true
    }
   ]
  }
 ]
}

我的问题是找到地址对象。使用当前代码,我收到一个 logcat 错误,显示没有 locationName 的值。我认为这是因为我首先需要指定要迭代的地址对象,但是我该怎么做呢?这是我现在拥有的当前实现。

//fetch
private void getData() {
    final ProgressDialog progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading...");
    progressDialog.show();

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            progressDialog.dismiss();
            try {
                JSONObject jsonObject = new JSONObject(response);
                JSONArray array = jsonObject.getJSONArray("pollingLocations");
                for(int i = 0; i < array.length(); i++){
                    JSONObject addressObject = array.getJSONObject(i);
                    for (int x = 0; x < addressObject.length(); x++){
                        VotingLoc votingLoc = new VotingLoc(addressObject.getString("locationName"),
                                addressObject.getString("line1"),
                                addressObject.getString("city"),
                                addressObject.getString("state"),
                                addressObject.getString("zip"),
                                addressObject.getString("pollingHours"));
                        votingList.add(votingLoc);
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("Volley", error.toString());
            progressDialog.dismiss();
        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}

定位错误:

有更简单的方法吗?我相信我的 rvadapter 类的代码是正确的,错误出在这个方法中,但是如果您想查看任何其他代码,请告诉我。

【问题讨论】:

  • 你缺少节点address
  • 这就是我的想法,但是当我为地址创建一个 jsonObject 时,logcat 错误然后说地址没有值。您能否更具体地说明您将如何实现这一点?
  • 我需要在场景中嵌套for循环吗?没有人怎么办?

标签: android arrays json


【解决方案1】:

通过获取数组中的第一个节点,您已经获得了address 节点,因此无需在那里运行loopaddress 对象不是数组,您可以直接获取值。试试这样的:

        JSONArray array = object.getJSONArray("pollingLocations");
        for (int i = 0; i < array.length(); i++) {
            JSONObject jsonObject = array.getJSONObject(i);
           String locationName = jsonObject.getJSONObject("address")
                   .getString("locationName");
           Log.d("locationName", locationName);
            JSONArray sourcesArray = jsonObject.getJSONArray("sources");

          // run loop to get values from this array
          for (int j = 0; j < sourcesArray.length(); j++){
                JSONObject source = sourcesArray.getJSONObject(j);
                String name = source.getString("name");
            }
        }

【讨论】:

  • 这是我想到的第一个解决方案,但每当我尝试创建 JSONObject 并将“地址”作为参数传递时,都会出现语法错误。我只能传递一个整数作为数组的索引,而不是字符串。
  • 我可以从 for 循环中传递索引 i 但它不会让我传递字符串
【解决方案2】:

另一种方法是使用像 gson (https://github.com/google/gson) 或 jackson (https://github.com/FasterXML/jackson) 这样的 json 解析器。如果您的唯一目标是显示这几个值,这可能会有点开销,因为您必须创建一些 java 类,您可能只需要解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    相关资源
    最近更新 更多