【问题标题】:Android Volley to parse JSON and put into listview is not workingAndroid Volley 解析 JSON 并放入 listview 不起作用
【发布时间】:2016-01-14 00:33:04
【问题描述】:

我在这里使用本指南:

http://www.androidhive.info/2014/07/android-custom-listview-with-image-and-text-using-volley/

我放了

System.out.println(error.getMessage());

在我下面的代码中,这是它显示给我的错误:

01-13 18:53:21.425 1915-1915/com.app.dev.myapplication I/System.out: org.json.JSONException: Value {"server_response":[{"first_name":"bob","last_name":"john","user_name":"bobthebuilder","avatar":"stringOfURL"}]} of type org.json.JSONObject cannot be converted to JSONArray
01-13 18:53:21.425 1915-1915/com.app.dev.myapplication D/Volley: [1] 2.onErrorResponse: SearchActivity

这是我的 JSON 代码:

{"server_response":[{"first_name":"bob","last_name":"john","user_name":"bobthebuilder","avatar":"stringOfURL"}]}

这是我的代码:

public class SearchActivity extends AppCompatActivity {

String JSON_STRING,sq,js_username,js_first_name,js_last_name,js_avatar;
EditText et_sq;
private static final String json_user_search_url = "http://www.domain.com/string.php";
private static final String TAG = SearchActivity.class.getSimpleName();
private List<SearchResults> movieList = new ArrayList<SearchResults>();
private ListView listView;
private CustomListAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    listView = (ListView) findViewById(R.id.listViewSearch);
    adapter = new CustomListAdapter(this, movieList);
    listView.setAdapter(adapter);

    // Creating volley request obj
    JsonArrayRequest movieReq = new JsonArrayRequest(json_user_search_url, new Response.Listener<JSONArray>() {

                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());

                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONArray responseArray = response.getJSONArray("server_response");
                            JSONObject content = responseArray.getJSONObject(0);
                            SearchResults movie = new SearchResults();
                            movie.setUser_name(obj.getString("user_name"));
                            movie.setFirst_name(obj.getString("first_name"));
                            movie.setLast_name(obj.getString("last_name"));
                            movie.setAvatarUrl(obj.getString("avatar"));

                            // adding movie to movies array
                            movieList.add(movie);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }

                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            System.out.println(error.getMessage());
            VolleyLog.d(TAG, "Error: " + error.getMessage());

        }
    });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(movieReq);
}

}

【问题讨论】:

    标签: android json listview android-volley


    【解决方案1】:

    响应是一个 JSON 对象,其中“server_response”是它的唯一值。 “server_response”本身就是一个JSONObject包裹的JSONArray,所以需要改一下:

    new JsonArrayRequest(json_user_search_url, new Response.Listener<JSONArray>() {
    

    到:

    new JsonObjectRequest(json_user_search_url, new Response.Listener<JSONObject>() {
    

    以及覆盖 onResponse:

    @Override
    public void onResponse(JSONObject response) {
    

    然后您可以访问响应并获取“server_response”,而无需像您一样循环访问内容:

    @Override
    public void onResponse(JSONObject response) {
        JSONArray responseArray = response.getJSONArray("server_response");
        JSONObject content = responseArray.getJSONObject(0);
        String firstName = content.getString("first_name");
    
        //get rest of the objects similarly...
    }
    

    编辑:在原始答案中犯了一个错误。 “server_response”是一个 JSONArray,在索引 0 处包含一个 JSON 对象。您访问 JSONObject 并将其内容存储为一个对象,然后提取其数据的键/值对。

    【讨论】:

    • 感谢您的回答。我编辑了这个问题。你能再读一遍吗?谢谢。
    • 抱歉,我看到了修改,但您没有做出我让您做的更改。您的 API 返回的响应是 JSONObject 而不是 JSONArray。在这种情况下,JSONArray 是“server_response”,它被包裹在一个 JSONObject 中。
    • 从头开始。我现在正在测试它。
    • 另外,它只显示 JSON 数组中的一组。如果我有两个人,例如 bob 和 jack,它只会在 XML 表上显示一个。你能指出我在哪里让它循环显示每个人的正确方向吗?正如您在此视频中看到的:youtube.com/watch?v=XWso6AWFsZw,它显示了许多“电影”,而不仅仅是一个。
    • 而不是让 JSONObject 在 0 循环通过 responseArrays 长度中的每个 JSONObject
    猜你喜欢
    • 1970-01-01
    • 2016-08-04
    • 2016-08-13
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多