【问题标题】:how to read JSON object using volley如何使用 volley 读取 JSON 对象
【发布时间】:2019-01-20 04:49:09
【问题描述】:

在我拥有的 json 链接中,它包含名为 products 的属性,它是一个包含多个对象的数组。如何读取该属性 products 并遍历其中的每个元素?例如如何获取 id、color 和 price 的值?我尝试了以下,但似乎这条线

Response.Listener<JSONObject> onPostsLoaded

不接受 JSONObject 作为类型

请告诉我如何使用 volley 读取 json 对象

 private void initGson() {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.setDateFormat("M/d/yy hh:mm a");
    gson = gsonBuilder.create();
}

private void doRetrofit() {
    API_BASE_URL = this.getResources().getString(R.string.BASE_URL);
    requestQueue = Volley.newRequestQueue(this);
    fetchPosts();
}

private void fetchPosts() {
    StringRequest request = new StringRequest(Request.Method.GET, API_BASE_URL, onPostsLoaded, onPostsError);
    requestQueue.add(request);
}

private final Response.Listener<JSONObject> onPostsLoaded = new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(String response) {
        Log.i(TAG, response);

        response.getJs
        //List<Repo> repos = Arrays.asList(gson.fromJson(response, Repo[].class));

        /*Log.i("PostActivity", repos.size() + " posts loaded.");
        for (Repo repo : repos) {
            //Log.i("PostActivity", repo.getImageUrl() + ": " + repo.getName());
        }*/
    }
};

private final Response.ErrorListener onPostsError = new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.e(TAG, error.toString());
    }
};

JSON

 products: [
 {
     name: "Yellow Triangle",
     type: "Triangle",
     id: 1,
     color: "Yellow",
     imageURL: "https://kredit.check24.de/konto- 
     kredit/ratenkredit/nativeapps/imgs/08.png",
     colorCode: "FFECB3",
     available: true,
     releaseDate: 1460629605,
     description: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, 
sed diam",
     longDescription: "Lorem ipsum dolor sit amet, consetetur sadipscing 
elitr, sed diam Lorem ipsum dolor sit amet, consetetur sadipscing 
elitr, sed diam Lorem ipsum dolor sit amet, consetetur sadipscing 
elitr, sed diam Lorem ipsum dolor sit amet, consetetur sadipscing 
elitr, sed diam",
     rating: 2.17,
     price: {
         value: 225.91,
         currency: "EUR"
         }
    },

【问题讨论】:

  • 你想要一个 JsonObjectRequest,而不是 StringRequest
  • 如果您想使用 Gson,请参阅 developer.android.com/training/volley/…
  • @cricket_007 我是否也应该更改这一行 JsonObjectRequest request = new StringRequest(Request.Method.GET, API_BASE_URL, onPostsLoaded, onPostsError); ??
  • new JsonObjectRequest,不是 StringRequest

标签: android json gson android-volley


【解决方案1】:

你应该start with the documentation。您可以使用 IDE 为您提取侦听器,而不是手动拉出侦听器。

侦听器的类型是响应的内容。

您告诉它使用 JSON 对象进行响应,但该方法没有实现正确的签名

这应该可以编译

private final Response.Listener<JSONObject> onPostsLoaded = new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        Log.i(TAG, String.valueOf(response));

既然你有 Gson,see it's usage in the documentation with Volley

【讨论】:

  • 我仍然有错误: private void fetchPosts() { JsonObjectRequest request = new StringRequest(Request.Method.GET, API_BASE_URL, onPostsLoaded, onPostsError); requestQueue.add(request); }......此行用红色标记:StringRequest(Request.Method.GET, API_BASE_URL, onPostsLoaded, onPostsError);
  • 您不能将 StringRequest 对象分配给 JsonObjectRequest 变量
  • 很好。我改变了它..但我仍然有错误,请帮助.error 在同一行:JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, API_BASE_URL, onPostsLoaded, onPostsError);
  • 在url后面添加null参数
【解决方案2】:

您选择了错误的数据类型。更改您的代码如下:

private void fetchPosts() {
    StringRequest request = new StringRequest(Request.Method.GET, API_BASE_URL, onPostsLoaded, onPostsError);
    requestQueue.add(request);
}

private final Response.Listener<String> onPostsLoaded = new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        JSONObject obj = new JSONObject(response);

        // use obj to get your data
    }
};

当有Response.Listener&lt;JSONObject&gt; 时,你有一个JSONObject 作为响应:

Response.Listener<String>     ----->    public void onResponse(String response)
Response.Listener<JSONObject> ----->    public void onResponse(JSONObject response)

【讨论】:

【解决方案3】:

试试看:

      Volley.newRequestQueue(getActivity()).add(new StringRequest(Request.Method.GET,"api_link", new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {
            JSONObject mJsonObject;

            try {
                JSONArray mJsonArray=new JSONArray(s)
                JSONArray mJsonArray1 = mJsonArray.getJSONArray("products");
                int a = mJsonArray1.length();
                for (int i = 0; i < a; i++) {
                    JSONObject jo = mJsonArray1.getJSONObject(i);
                    homeModel.setID(jo.getString("color"));
                    //AND add somthing code u want

                }
            } catch (JSONException e) {
                Toast.makeText(getActivity(), "Exception", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }

还有我的 HomeModel 列表:

 public class HomeModel {
public String ID;
public String pic;
public String color;

public String getcolor() {
    return color;
}

 public String setcolor(String color) {
   this.color=String color
   }

 }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多