JSON parsing app “no data”?

匿名 (未验证) 提交于 2019-12-03 09:14:57

问题:

Here's the code for my JSON parsing app. It force closes as soon as I run it on my emulator. I am new to Android programming, and I'm self taught so please bear with me. Thanks!

JSONfunctions.java:

package com.pxr.tutorial.json;  import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap;  import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;  import android.util.Log;  public class JSONfunctions {  public static JSONObject getJSONfromURL(String url){     InputStream is = null;     String result = "";     JSONObject jArray = null;      //http post     try{             HttpClient httpclient = new DefaultHttpClient();             HttpPost httppost = new HttpPost(url);             HttpResponse response = httpclient.execute(httppost);             HttpEntity entity = response.getEntity();             is = entity.getContent();      }catch(Exception e){             Log.e("log_tag", "Error in http connection "+e.toString());     }    //convert response to string     try{             BufferedReader reader = new BufferedReader(new                             InputStreamReader(is,"iso-8859-1"),8);             StringBuilder sb = new StringBuilder();             String line = null;             while ((line = reader.readLine()) != null) {                     sb.append(line + "\n");             }             is.close();             result=sb.toString();     }catch(Exception e){             Log.e("log_tag", "Error converting result "+e.toString());     }      try{          jArray = new JSONObject(result);                 }catch(JSONException e){             Log.e("log_tag", "Error parsing data "+e.toString());     }      return jArray; } } 

Main.java:

package com.pxr.tutorial.json;  import java.util.ArrayList; import java.util.HashMap;  import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList;  import com.pxr.tutorial.xmltest.R;  import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast;  public class Main extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.listplaceholder);      ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String,      String>> ();       JSONObject json = JSONfunctions.getJSONfromURL ("http://www.tastekid.com/ask/ws?q=mosdef&f=musifin2125&k=mjjlnzkyzwuz&format=JSON");                     try{          JSONArray  similar = json.getJSONArray("similar");          for(int i=0;i<similar.length();i++){                                     HashMap<String, String> map = new HashMap<String, String>();                 JSONObject e = similar.getJSONObject(i);              map.put("id",  String.valueOf(i));             map.put("name", "Name:" + e.getString("name"));             map.put("type", "Type: " +  e.getString("type"));             mylist.add(map);                     }            }catch(JSONException e)        {          Log.e("log_tag", "Error parsing data "+e.toString());     }      ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.main,                      new String[] { "name", "type" },                      new int[] { R.id.item_title, R.id.item_subtitle });      setListAdapter(adapter);      final ListView lv = getListView();     lv.setTextFilterEnabled(true);       lv.setOnItemClickListener(new OnItemClickListener() {         public void onItemClick(AdapterView<?> parent, View view, int position,             long id) {                               @SuppressWarnings("unchecked")             HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);                              Toast.makeText(Main.this, "ID '" + o.get("id") + "' was clicked.",    Toast.LENGTH_SHORT).show();          }     }); } } 

EDIT - Fixed unhandled exception, but now it says "No data" when I try to parse the URL.

Thanks again!

回答1:

Here are your mistakes:

JSONArray similar = json.getJSONArray("similar");

  1. In parsing JSON you have to note that it's case sensitive, i see that your json object is Similiar but you try to get it as similiar.
  2. Similiar is a JSON Object but you try to get it as a JSONArray

Here is the fix for your codes, i give you a fix to get Info inside Similiar object:

        JSONObject earthquakes = json.getJSONObject("Similar");         JSONArray info = earthquakes.getJSONArray("Info");          for (int i = 0; i < info.length(); i++) {             HashMap<String, String> map = new HashMap<String, String>();             JSONObject e = info.getJSONObject(i);              map.put("id", String.valueOf(i));             map.put("name", "Name:" + e.getString("Name"));             map.put("type", "Type: " + e.getString("Type"));             mylist.add(map);         } 

Replace your code block inside try after JSONObject json = JSONFun.getJSONfromURL("http://www.tastekid.com/ask/ws? q=mosdef&f=musifin2125&k=mjjlnzkyzwuz&format=JSON"); with code above.



回答2:

have you added the permission tag in your manifest file which allow the use of internet



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!