【问题标题】:JSON Parsing using volley library使用 volley 库进行 JSON 解析
【发布时间】:2016-03-22 10:11:01
【问题描述】:

您好,任何有 volley 库经验的人都可以帮我在以下代码中获取 JSON。我得到一个错误日志:

D/Volley:[13] BasicNetwork.logSlowRequests:请求的 HTTP 响应=http://digitaresolutions.com/apps/drugindex/getbrand.php?id=bactiflox0xdf379d06 NORMAL 1>[lifetime=19209],[size=160],[rc=200],[retryCount= 0]; I/Search_view: org.json.JSONException: java.lang.String 类型的值无法转换为 JSONObject

public class Search_view extends AppCompatActivity {
String brandURL = "http://digitaresolutions.com/apps/drugindex/getbrand.php?id=";

private String TAG = this.getClass().getSimpleName();
private ListView lstView;
private RequestQueue mRequestQueue;
private ArrayList<BrandModel> arrBrand ;
private LayoutInflater lf;
private VolleyAdapter va;
private ProgressDialog pd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.brand_main);
    lf = LayoutInflater.from(this);


    arrBrand = new ArrayList<BrandModel>();
    va = new VolleyAdapter();

    lstView = (ListView) findViewById(R.id.listView);
    lstView.setAdapter(va);
    mRequestQueue =  Volley.newRequestQueue(this);

    // getting attached intent data
    Intent i = getIntent();
    String product = i.getStringExtra("product");

    // displaying selected product name
    String url = brandURL + product;

    // JSON Data
    pd = ProgressDialog.show(this,"Loading...","Please Wait...");
    try{
        Thread.sleep(2000);
    }catch(Exception e){

    }
    JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.i(TAG,response.toString());
            parseJSON(response);
            va.notifyDataSetChanged();
            pd.dismiss();
            ;            }
    },new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.i(TAG,error.getMessage());
        }
    });
    mRequestQueue.add(jr);



}

private void parseJSON(JSONObject json){
    try{
        JSONObject value = json.getJSONObject(null);
        JSONArray items = value.getJSONArray("result");
        for(int x=0;x<items.length();x++){

            JSONObject item = items.getJSONObject(x);
            BrandModel nm = new BrandModel();
            nm.setDrugbrand(item.optString("drugbrand"));
            nm.setManu(item.optString("manu"));
            nm.setDetails(item.optString("details"));
            arrBrand.add(nm);
        }
    }
    catch(Exception e){
        e.printStackTrace();
    }


}


public class BrandModel
{
    private String details;

    private String manu;

    private String drugbrand;

    public String getDetails ()
    {
        return details;
    }

    public void setDetails (String details)
    {
        this.details = details;
    }

    public String getManu ()
    {
        return manu;
    }

    public void setManu (String manu)
    {
        this.manu = manu;
    }

    public String getDrugbrand ()
    {
        return drugbrand;
    }

    public void setDrugbrand (String drugbrand)
    {
        this.drugbrand = drugbrand;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [details = "+details+", manu = "+manu+", drugbrand = "+drugbrand+"]";
    }
}


class VolleyAdapter extends BaseAdapter{

    @Override
    public int getCount() {
        return arrBrand.size();
    }

    @Override
    public Object getItem(int x) {
        return arrBrand.get(x);
    }

    @Override
    public long getItemId(int x) {
        return 0;
    }

    @Override
    public View getView(int x, View view, ViewGroup viewGroup) {
        ViewHolder vh ;
        if(view == null){
            vh = new ViewHolder();
            view = lf.inflate(R.layout.brand_row_listview,null);
            vh.tvTitle = (TextView) view.findViewById(R.id.txtTitle);
            vh.tvManu = (TextView) view.findViewById(R.id.txtManufacturer);
            vh.tvDetails = (TextView) view.findViewById(R.id.txtDetails);
            view.setTag(vh);
        }
        else{
            vh = (ViewHolder) view.getTag();
        }

        BrandModel nm = arrBrand.get(x);
        vh.tvTitle.setText(nm.getDrugbrand());
        vh.tvManu.setText(nm.getManu());
        vh.tvDetails.setText(nm.getDetails());
        return view;
    }

    class  ViewHolder{
        TextView tvTitle;
        TextView tvManu;
        TextView tvDetails;

    }
    // End JSON Loading code block
}

}

【问题讨论】:

  • 实际上能够获得一个标记为“产品”的意图值,它为我提供了我需要的唯一 json 数据。 url 和加载部分运行良好,但无法获取 json。是我的 JSON 格式需要修复还是有什么问题?

标签: java json


【解决方案1】:

看看有没有帮助

public class SomeActivity extends AppCompatActivity {

    ProgressDialog pd;
    TextView txtView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_volley);

        txtView = (TextView) findViewById(R.id.txt_volley);

        String id = "bactiflox";
        String url = new Uri.Builder()
                .encodedPath("http://digitaresolutions.com")
                .appendEncodedPath("apps/drugindex/getbrand.php")
                .appendQueryParameter("id", id)
                .build().toString();

        JsonObjectRequest req = new JsonObjectRequest(url, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                pd.dismiss();
                txtView.setText(response.toString());

                try {
                    JSONArray mydata = response.getJSONArray("mydata");
                    for (int i = 0; i < mydata.length(); i++) {
                        JSONObject obj = mydata.getJSONObject(i);

                        Log.i("JSON", obj.getString("manu"));
                        Log.i("JSON", obj.getString("details"));
                        Log.i("JSON", obj.getString("drugbrand"));
                    }
                } catch (JSONException e) {
                    txtView.setText(e.toString());
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                pd.dismiss();
                txtView.setText(String.valueOf(error));
            }
        });

        addToRequestQueue(req); // TODO: Implement
        pd = ProgressDialog.show(this,"Loading...","Please Wait...");

    }

}

【讨论】:

  • 嗨 Cricket_007,addToRequestQueue(req) 存在问题;错误:(53, 33) 错误:没有找到适合 JsonObjectRequest(String,>,) 构造函数的构造函数 JsonObjectRequest.JsonObjectRequest(String,JSONObject,Listener,ErrorListener) 不适用(实际参数列表和形式参数列表长度不同)构造函数 JsonObjectRequest.JsonObjectRequest(int,String,JSONObject,Listener,ErrorListener) 不适用(实际参数列表和形式参数列表长度不同)
  • TODO 注释意味着替换为您使用 Volley 的任何方式。您已经在问题中显示的代码中有mRequestQueue.add(req);。至于其他错误,请确保您拥有最新版本的 Volley
  • 或者确保您正在导入 org.json 包而不是其他一些 JSONObject 类
【解决方案2】:

将 JsonObjectRequest 替换为 StringRequest。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.brand_main);
    lf = LayoutInflater.from(this);


    arrBrand = new ArrayList<BrandModel>();
    va = new VolleyAdapter();

    lstView = (ListView) findViewById(R.id.listView);
    lstView.setAdapter(va);
    mRequestQueue =  Volley.newRequestQueue(this);

    // getting attached intent data
    Intent i = getIntent();
    String product = i.getStringExtra("product");

    // displaying selected product name
    String url = brandURL + product;

    // JSON Data
    pd = ProgressDialog.show(this,"Loading...","Please Wait...");
    try{
        Thread.sleep(2000);
    }catch(Exception e){

    }
    StringRequest req=new StringRequest(url, new Listener<String>() {

            @Override
            public void onResponse(String response) {
                // TODO Auto-generated method stub

                try {
                parseJSON(new JSONObject(response));  
                va.notifyDataSetChanged();
                pd.dismiss();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            }
        }, new ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError arg0) {
                // TODO Auto-generated method stub
                pd.dismiss();
            }
        });

        mRequestQueue.add(req);
} 

用下面的代码替换 parseJSON 函数。

private void parseJSON(JSONObject json){
        try{

            if(!json.isNull("result")) {

                JSONArray items = json.getJSONArray("result");
                for (int x = 0; x < items.length(); x++) {

                    JSONObject item = items.getJSONObject(x);
                    BrandModel nm = new BrandModel();
                    nm.setDrugbrand(item.optString("drugbrand"));
                    nm.setManu(item.optString("manu"));
                    nm.setDetails(item.optString("details"));
                    arrBrand.add(nm);
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }  

试试这个。它的工作。

【讨论】:

  • 仍有错误; 03-22 17:32:04.649 11144-11144/digitare.nfk_drugindex I/Search_view: org.json.JSONException: java.lang.String 类型的值无法转换为 JSONObject
  • 检查更新的答案,让我们知道它的工作不是。
  • 你好戈文达;我刚刚使用了您的代码,显然只有 ProgressDialog 是旋转的。请注意,我正在从填写 url 的意图中获取产品价值,请查看digitaresolutions.com/apps/drugindex/getbrand.php?id=bactiflox 的示例数据,其中 bactiflox 是我的案例产品。我只是想在我的 android 上显示这个。
  • 根据您的问题,由于 JSONObject 响应不正确,JsonObjectRequest 出错。请详细说明您的期望并编辑您的问题。
【解决方案3】:

删除这一行

JSONObject value = json.getJSONObject(null);

改变这一行...

JSONArray items = value.getJSONArray("result")

JSONArray items = json.getJSONArray("result");

【讨论】:

  • 这是生成的:03-22 17:25:24.869 8297-8297/digitare.nfk_drugindex I/Search_view: org.json.JSONException: java.lang.String 类型的值无法转换为 JSONObject
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多