2016-03-22 12 views
0

Hallo kann jemand Erfahrung mit Volley-Bibliothek mir helfen, JSON in den folgenden Code zu bekommen. Bin gettin ein Fehlerprotokoll:JSON Parsing mit Volley-Bibliothek

D/Volley: [13] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://digitaresolutions.com/apps/drugindex/getbrand.php?id=bactiflox 0xdf379d06 NORMAL 1> [lifetime=19209], [size=160], [rc=200], [retryCount=0]; I/Search_view: org.json.JSONException: Value of type java.lang.String cannot be converted to 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 
} 

}

+0

tatsächlich in der Lage hilft ist eine Absicht Wert zu erhalten ‚Produkt‘ markiert, die mir die einzigartigen json Daten gibt die ich brauche. Die URL und der Ladebereich funktionieren gut, können aber json nicht erreichen. Ist es mein JSON-Format, das repariert werden muss oder was kann das Problem sein? – Brian

Antwort

0

Entfernen Sie diese Zeile

JSONObject value = json.getJSONObject(null); 

Ändern Sie diese Zeile ...

JSONArray items = value.getJSONArray("result") 

zu

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

Dies wird generiert: 03-22 17: 25: 24.869 8297-8297/digitare.nfk_drugindex I/Search_view: org.json.JSONException: Wert des Typs java.lang.String kann nicht in JSONObject konvertiert werden – Brian

1

Ersetzen Sie JsonObjectRequest zu StringRequest.
d.h.

@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); 
} 

mit folgendem Code ersetzen parseJSON Funktion.

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(); 
     } 
    } 

Versuchen Sie es. es hat funktioniert.

+0

Immer noch mit einem Fehler; 03-22 17: 32: 04.649 11144-11144/digitare.nfk_drugindex I/Search_view: org.json.JSONException: Wert des Typs java.lang.String kann nicht in JSONObject konvertiert werden – Brian

+0

Überprüfen Sie die aktualisierte Antwort und lassen Sie uns wissen, dass es nicht funktioniert . –

+0

Hallo Govinda; Ich habe gerade deinen Code benutzt, anscheinend dreht sich nur der ProgressDialog. Bitte beachten Sie, dass ein Produktwert aus einer Absicht, die URL zu füllen, erhalten werden, überprüfen Sie eine Beispieldaten unter http://digitresolutions.com/apps/drugindex/getbrand.php?id=bactiflox, wo Bactiflox mein Fallprodukt ist. Ich wollte das nur auf meinem Android zeigen. – Brian

0

Sehen Sie, wenn diese

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..."); 

    } 

} 
+0

Hallo Cricket_007, es gibt ein Problem mit addToRequestQueue (req); Fehler: (53, 33) Fehler: kein geeigneter Konstruktor für JsonObjectRequest gefunden (String, >, ) Konstruktor JsonObjectRequest.JsonObjectRequest (String, JSONObject, Listener , ErrorListener) ist nicht anwendbar (tatsächliche und formale Argumentlisten unterscheiden sich in der Länge) Konstruktor JsonObjectRequest.JsonObjectRequest (int, String, JSONObject, Listener , ErrorListener) ist nicht anwendbar (tatsächliche und formale Argumentlisten unterscheiden sich in der Länge) – Brian

+0

Der TODO-Kommentar bedeutet ersetzen mit jedoch Sie Volley verwenden . Sie hatten bereits 'mRequestQueue.add (req);' in dem in der Frage gezeigten Code. Stellen Sie sicher, dass Sie die neueste Version von Volley –

+0

haben Oder stellen Sie sicher, dass Sie 'org.json'-Pakete importieren und nicht irgendeine andere JSONObject-Klasse –