使用JSON和PHP从Mysql数据库获取数据时出错

问题描述:

我正在学习构建android应用程序,我需要一些帮助从MySQL获取数据。我跟着this tutorial做,但我得到这个错误:使用JSON和PHP从Mysql数据库获取数据时出错

Error org.json.JSONEXception: Value of type java.lang.String cannot be converted to JSONObject

在我的MainActivity我有一个按钮,点击打开第二个活动的时候。第二项活动必须从数据库中获取并显示数据。这是第二个活动Restaurant.java

public class Restaurants extends Activity { 
    private String jsonResult; 
    private String url = "http://10.0.2.2/app1/GetRestaurants.php"; 
    private ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.restaurants); 
     listView = (ListView) findViewById(R.id.listView1); 
     accessWebService(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
    } 

    // Async Task to access the web 
    private class JsonReadTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(params[0]); 
    try { 
     HttpResponse response = httpclient.execute(httppost); 
     jsonResult = inputStreamToString(
     response.getEntity().getContent()).toString(); 
    } 

    catch (ClientProtocolException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    return null; 
} 

private StringBuilder inputStreamToString(InputStream is) { 
    String rLine = ""; 
    StringBuilder answer = new StringBuilder(); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

try { 
    while ((rLine = rd.readLine()) != null) { 
    answer.append(rLine); 
} 
} 

catch (IOException e) { 
// e.printStackTrace(); 
    Toast.makeText(getApplicationContext(), 
    "Error..." + e.toString(), Toast.LENGTH_LONG).show(); 
} 
    return answer; 
} 

    @Override 
    protected void onPostExecute(String result) { 
    ListDrwaer(); 
    } 
}// end async task 

public void accessWebService() { 
    JsonReadTask task = new JsonReadTask(); 
    // passes values for the urls string array 
    task.execute(new String[] { url }); 
} 

// build hash set for list view 
public void ListDrwaer() { 
    List<Map<String, String>> restaurantList = new ArrayList<Map<String, String>>(); 

try { 
    JSONObject jsonResponse = new JSONObject(jsonResult); 
    JSONArray jsonMainNode = jsonResponse.optJSONArray("restoranti"); 

    for (int i = 0; i < jsonMainNode.length(); i++) { 
    JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 
    String name = jsonChildNode.optString("name"); 
    String menu = jsonChildNode.optString("menu"); 
    String outPut = name + "-" + menu; 
    restaurantList.add(createRestaurants("restoranti", outPut)); 
    } 
} catch (JSONException e) { 
     Toast.makeText(getApplicationContext(), "Error " + e.toString(), 
     Toast.LENGTH_SHORT).show(); 
    } 

SimpleAdapter simpleAdapter = new SimpleAdapter(this, restaurantList, 
    android.R.layout.simple_list_item_1, 
    new String[] { "restoranti" }, new int[] { android.R.id.text1 }); 
    listView.setAdapter(simpleAdapter); 
} 

private HashMap<String, String> createRestaurants(String name, String menu) { 
     HashMap<String, String> restaurantNameNo = new HashMap<String, String>(); 
     restaurantNameNo.put(name, menu); 
     return restaurantNameNo; 
} 
} 

此的代码是restaurants.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="14dp" > 
</ListView> 

请让我知道如果需要发布更多的代码。许多感谢的帮助。

我也发现this answer到几乎相似的帖子,并试图使相同,但没有为我工作。相同的错误和空白页面。

+2

response.getEntity()。getContent(),看起来你没有得到一个JSON对象的内容是什么?加上你总是返回null(所以没有结果在相同的方法) – Drejc 2014-10-29 13:14:53

// Maybe this will help ... 
    private class JsonReadTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(params[0]); 
    try { 
     HttpResponse response = httpclient.execute(httppost); 
     jsonResult = inputStreamToString(
     response.getEntity().getContent()).toString(); 

// LETS RETURN SOMETING ... 
     return jsonResult; 
    } 

    catch (ClientProtocolException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    return null; 
} 
+0

这个返回'不幸的应用程序已停止'和应用程序崩溃。 '你的意思是什么'response.getEntity()。getContent()'的内容是什么? – Goro 2014-10-29 13:21:00

+0

你有没有得到一个jsonResult ...你从你的电话回来了什么?调试这部分或记录它...看看发生了什么。 – Drejc 2014-10-29 13:28:38

+0

好吧,我已经上传文件和数据库在远程主机(互联网)不在本地主机上,并工作得很好。所以问题出在我的本地主机上。 – Goro 2014-10-29 14:47:59