JSON Android和Listview

JSON Android和Listview,android,json,listview,android-activity,Android,Json,Listview,Android Activity,我正在寻找一个在Android中将JSON解析为Listview的好教程 问题是我的JSON文件是这样的 [{"location_id":"823","company_id":"41","name":"Milj\u00f8station","address":"Aldersro \/ Aldersro 8","place":"","postal":"5700","city":"Svendborg","monday":"","tuesday":"","wednesday":"","thursday

我正在寻找一个在Android中将JSON解析为Listview的好教程

问题是我的JSON文件是这样的

[{"location_id":"823","company_id":"41","name":"Milj\u00f8station","address":"Aldersro \/ Aldersro 8","place":"","postal":"5700","city":"Svendborg","monday":"","tuesday":"","wednesday":"","thursday":"","friday":"","saturday":"","sunday":"","type":"2","lat":"55.061426149085","lng":"10.5927246809006","nocar":"0","distance":"0.00023254303859579"}]
大多数教程都是从Json数组开始,然后是数据。我知道有很多例子,但我找不到与我的问题相匹配的

我添加了代码,但仍然不起作用,下面是我的3个类

SingleMenuItemActivity

public class SingleMenuItemActivity  extends Activity {

// JSON node keys
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_PHONE_MOBILE = "mobile";
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.single_list_item);

    // getting intent data
    Intent in = getIntent();

    // Get JSON values from previous intent
    String name = in.getStringExtra(TAG_NAME);
    String cost = in.getStringExtra(TAG_EMAIL);
    String description = in.getStringExtra(TAG_PHONE_MOBILE);

    // Displaying all values on the screen
    TextView lblName = (TextView) findViewById(R.id.name_label);
    TextView lblCost = (TextView) findViewById(R.id.email_label);
    TextView lblDesc = (TextView) findViewById(R.id.mobile_label);

    lblName.setText(name);
    lblCost.setText(cost);
    lblDesc.setText(description);
} }
public class AndroidJSONParsingActivity extends ListActivity {

// url to make request
private static String url = "http://webservice.xxx.com/webservice/getLocationList.php?lat=55.061424255371094&lng=10.592724800109863";

// JSON Node names
private static final String TAG_Location = "location_id";
private static final String TAG_Company = "company_id";
private static final String TAG_NAME = "name";
private static final String TAG_ADDRESS = "address";
private static final String TAG_PLACE = "place";
private static final String TAG_POSTAL = "postal";
private static final String TAG_CITY = "city";
private static final String TAG_MONDAY = "monday";
private static final String TAG_TUESDAY = "tuesday";
private static final String TAG_WEDNESDAY = "wednesday";
private static final String TAG_THURSDAY = "thursday";
private static final String TAG_FRIDAY = "friday";
private static final String TAG_SATURDAY = "saturday";
private static final String TAG_SUNDAY = "sunday";
private static final String TAG_TYPE = "type";
private static final String TAG_LAT = "lat";
private static final String TAG_LNG = "lng";
private static final String TAG_NOCAR = "nocar";



// contacts JSONArray
JSONArray contacts = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

    try {

        // looping through All Contacts
        for(int i = 0; i < contacts.length(); i++){
            JSONObject c = contacts.getJSONObject(i);

            // Storing each json item in variable
            String location_id = c.getString(TAG_Location);
            String company_id = c.getString(TAG_Company);
            String name = c.getString(TAG_NAME);
            String address = c.getString(TAG_ADDRESS);
            String place = c.getString(TAG_PLACE);  
            String postal = c.getString(TAG_POSTAL);
            String city = c.getString(TAG_CITY);
            String monday = c.getString(TAG_MONDAY);
            String tuesday = c.getString(TAG_TUESDAY);
            String wednesday = c.getString(TAG_WEDNESDAY);  
            String thursday = c.getString(TAG_THURSDAY);
            String friday = c.getString(TAG_FRIDAY);
            String saturday = c.getString(TAG_SATURDAY);
            String sunday = c.getString(TAG_SUNDAY);
            String type = c.getString(TAG_TYPE);
            String lat = c.getString(TAG_LAT);
            String lng = c.getString(TAG_LNG);
            String nocar = c.getString(TAG_NOCAR);


        // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            // adding each child node to HashMap key => value
            map.put(TAG_Location, location_id);
            map.put(TAG_Company, company_id);
            map.put(TAG_NAME, name);
            map.put(TAG_ADDRESS, address);
            map.put(TAG_PLACE, place);
            map.put(TAG_POSTAL, postal);
            map.put(TAG_CITY, city);
            map.put(TAG_MONDAY, monday);
            map.put(TAG_TUESDAY, tuesday);
            map.put(TAG_WEDNESDAY, wednesday);
            map.put(TAG_THURSDAY, thursday);
            map.put(TAG_FRIDAY, friday);
            map.put(TAG_SATURDAY, saturday);
            map.put(TAG_SUNDAY, sunday);
            map.put(TAG_TYPE, type);
            map.put(TAG_LAT, lat);
            map.put(TAG_LNG, lng);
            map.put(TAG_NOCAR, nocar);

                // adding HashList to ArrayList
            contactList.add(map);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }


    /**
     * Updating parsed JSON data into ListView
     * */
    ListAdapter adapter = new SimpleAdapter(this, contactList,
            R.layout.list_item,
            new String[] { TAG_NAME, TAG_LAT, TAG_Company }, new int[] {
                    R.id.name, R.id.email, R.id.mobile });

    setListAdapter(adapter);

    // selecting single ListView item
    ListView lv = getListView();

    // Launching new screen on Selecting Single ListItem
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
            String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
            String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();

            // Starting new intent
            Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_Location, cost);
            in.putExtra(TAG_Company, description);
            startActivity(in);

        }
    });
} }
JSONParser

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();           

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    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();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;
} }
AndroidJSONParseRactivity

public class SingleMenuItemActivity  extends Activity {

// JSON node keys
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_PHONE_MOBILE = "mobile";
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.single_list_item);

    // getting intent data
    Intent in = getIntent();

    // Get JSON values from previous intent
    String name = in.getStringExtra(TAG_NAME);
    String cost = in.getStringExtra(TAG_EMAIL);
    String description = in.getStringExtra(TAG_PHONE_MOBILE);

    // Displaying all values on the screen
    TextView lblName = (TextView) findViewById(R.id.name_label);
    TextView lblCost = (TextView) findViewById(R.id.email_label);
    TextView lblDesc = (TextView) findViewById(R.id.mobile_label);

    lblName.setText(name);
    lblCost.setText(cost);
    lblDesc.setText(description);
} }
public class AndroidJSONParsingActivity extends ListActivity {

// url to make request
private static String url = "http://webservice.xxx.com/webservice/getLocationList.php?lat=55.061424255371094&lng=10.592724800109863";

// JSON Node names
private static final String TAG_Location = "location_id";
private static final String TAG_Company = "company_id";
private static final String TAG_NAME = "name";
private static final String TAG_ADDRESS = "address";
private static final String TAG_PLACE = "place";
private static final String TAG_POSTAL = "postal";
private static final String TAG_CITY = "city";
private static final String TAG_MONDAY = "monday";
private static final String TAG_TUESDAY = "tuesday";
private static final String TAG_WEDNESDAY = "wednesday";
private static final String TAG_THURSDAY = "thursday";
private static final String TAG_FRIDAY = "friday";
private static final String TAG_SATURDAY = "saturday";
private static final String TAG_SUNDAY = "sunday";
private static final String TAG_TYPE = "type";
private static final String TAG_LAT = "lat";
private static final String TAG_LNG = "lng";
private static final String TAG_NOCAR = "nocar";



// contacts JSONArray
JSONArray contacts = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

    try {

        // looping through All Contacts
        for(int i = 0; i < contacts.length(); i++){
            JSONObject c = contacts.getJSONObject(i);

            // Storing each json item in variable
            String location_id = c.getString(TAG_Location);
            String company_id = c.getString(TAG_Company);
            String name = c.getString(TAG_NAME);
            String address = c.getString(TAG_ADDRESS);
            String place = c.getString(TAG_PLACE);  
            String postal = c.getString(TAG_POSTAL);
            String city = c.getString(TAG_CITY);
            String monday = c.getString(TAG_MONDAY);
            String tuesday = c.getString(TAG_TUESDAY);
            String wednesday = c.getString(TAG_WEDNESDAY);  
            String thursday = c.getString(TAG_THURSDAY);
            String friday = c.getString(TAG_FRIDAY);
            String saturday = c.getString(TAG_SATURDAY);
            String sunday = c.getString(TAG_SUNDAY);
            String type = c.getString(TAG_TYPE);
            String lat = c.getString(TAG_LAT);
            String lng = c.getString(TAG_LNG);
            String nocar = c.getString(TAG_NOCAR);


        // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            // adding each child node to HashMap key => value
            map.put(TAG_Location, location_id);
            map.put(TAG_Company, company_id);
            map.put(TAG_NAME, name);
            map.put(TAG_ADDRESS, address);
            map.put(TAG_PLACE, place);
            map.put(TAG_POSTAL, postal);
            map.put(TAG_CITY, city);
            map.put(TAG_MONDAY, monday);
            map.put(TAG_TUESDAY, tuesday);
            map.put(TAG_WEDNESDAY, wednesday);
            map.put(TAG_THURSDAY, thursday);
            map.put(TAG_FRIDAY, friday);
            map.put(TAG_SATURDAY, saturday);
            map.put(TAG_SUNDAY, sunday);
            map.put(TAG_TYPE, type);
            map.put(TAG_LAT, lat);
            map.put(TAG_LNG, lng);
            map.put(TAG_NOCAR, nocar);

                // adding HashList to ArrayList
            contactList.add(map);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }


    /**
     * Updating parsed JSON data into ListView
     * */
    ListAdapter adapter = new SimpleAdapter(this, contactList,
            R.layout.list_item,
            new String[] { TAG_NAME, TAG_LAT, TAG_Company }, new int[] {
                    R.id.name, R.id.email, R.id.mobile });

    setListAdapter(adapter);

    // selecting single ListView item
    ListView lv = getListView();

    // Launching new screen on Selecting Single ListItem
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
            String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
            String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();

            // Starting new intent
            Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_Location, cost);
            in.putExtra(TAG_Company, description);
            startActivity(in);

        }
    });
} }

因为您的Web服务返回的是一个
JSONArray
,而不是
JSONObject
,但您正在尝试将其转换为JSONObject。将
getJSONFromUrl
方法返回类型更改为
JSONArray
,而不是
JSONObject
,如下所示:

public JSONArray getJSONFromUrl(String url) {
 JSONArray jsonarr=null;
    // Making HTTP request

    // try parse the string to a JSONArray
    try {
        jsonarr = new JSONArray(json);
    } catch (JSONException e) {

    }

    // return JSON String
    return jsonarr;  //<<<< return JSONArray instead of JSONObject
}

因为您的Web服务返回的是一个
JSONArray
,而不是
JSONObject
,但您正在尝试将其转换为JSONObject。将
getJSONFromUrl
方法返回类型更改为
JSONArray
,而不是
JSONObject
,如下所示:

public JSONArray getJSONFromUrl(String url) {
 JSONArray jsonarr=null;
    // Making HTTP request

    // try parse the string to a JSONArray
    try {
        jsonarr = new JSONArray(json);
    } catch (JSONException e) {

    }

    // return JSON String
    return jsonarr;  //<<<< return JSONArray instead of JSONObject
}

我曾经使用过相同的教程,通过在try-catch块中替换JSONParser类中的代码解决了这个问题。这是一个毫无用处的类,您可以在onCreate()中键入它,或在AndroidJSONParseActivity类中写入方法:

HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpGet request = new HttpGet(url);
HttpResponse response = httpclient.execute(request);
HttpEntity resEntity = response.getEntity();
String _response=EntityUtils.toString(resEntity); // content will be consume only once
Log.i(".......",_response);
JSONObject json = new JSONObject(_response);
JSONArray jarray = json.getJSONArray("array_name");
for(int i=0;i<jarray.length();i++)
{
    JSONObject jb = (JSONObject) jarray.get(i);
    String name = jb.getString("name");
}
HttpClient-HttpClient=newdefaulthttpclient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
HttpGet请求=新的HttpGet(url);
HttpResponse response=httpclient.execute(请求);
HttpEntity当前性=response.getEntity();
字符串_response=EntityUtils.toString(最近性);//内容将只被消费一次
Log.i(“……”,_响应);
JSONObject json=新的JSONObject(_响应);
JSONArray jarray=json.getJSONArray(“数组名称”);

对于(int i=0;i我曾经使用过相同的教程,我通过在try-catch块中替换JSONParser类中的代码来解决问题。无论如何,这个类都是无用的,您可以在onCreate()中键入它,或者在AndroidJSONParseActivity类中写入方法:

HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpGet request = new HttpGet(url);
HttpResponse response = httpclient.execute(request);
HttpEntity resEntity = response.getEntity();
String _response=EntityUtils.toString(resEntity); // content will be consume only once
Log.i(".......",_response);
JSONObject json = new JSONObject(_response);
JSONArray jarray = json.getJSONArray("array_name");
for(int i=0;i<jarray.length();i++)
{
    JSONObject jb = (JSONObject) jarray.get(i);
    String name = jb.getString("name");
}
HttpClient-HttpClient=newdefaulthttpclient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
HttpGet请求=新的HttpGet(url);
HttpResponse response=httpclient.execute(请求);
HttpEntity当前性=response.getEntity();
String _response=EntityUtils.toString(resEntity);//内容将只使用一次
Log.i(“……”,_响应);
JSONObject json=新的JSONObject(_响应);
JSONArray jarray=json.getJSONArray(“数组名称”);


对于(int i=0;i列出整个堆栈跟踪,只列出与您的问题相关的代码。我们还有工作要做。伙计,您认为您的英语不好吗?如果是这样,请尝试使用正确的语法,使用上i表示i,而不是下i。向我们展示您的一些努力。您正在主UI线程上进行Web调用。这也是出现异常的原因。要解决它,yo你应该实现线程机制,最好的线程方式是使用
AsyncTask
实现Web调用。把整个堆栈跟踪,只放与你的问题相关的代码。我们也有我们的工作要做。伙计,你认为你的英语不好吗?如果是这样,试着使用正确的语法,用上I代替下I。给我们展示一些效果你在主UI线程上进行Web调用。这也是异常的原因。要解决它,你应该实现线程机制,最好的线程方式是使用
AsyncTask
实现Web调用。你在回答中有什么建议?我的意思是用户在代码中犯了什么错误。我想他正在最新的v上运行应用程序android版本,他在主线程上执行Http服务器请求,这就是他面临问题的原因。他应该使用异步任务,这是你应该在回答中包含的内容,以获得upvote:)否则简单的代码并不是完美的答案。实际上我不需要upvote,我只是想帮助。其次,他正在做这件事“填充列表"我以一种复杂的方式给了他做同样事情的简单代码,但你为什么不在答案中描述它,而不是在这里发表评论。你的答案中有什么建议?我的意思是用户在代码中犯了什么错误。我想他在最新版本的android上运行应用程序,在主线程上执行Http服务器请求为什么他会面临这个问题。他应该使用异步任务来解决这个问题,这是你应该在答案中包含的东西,以获得更新投票:)否则简单的代码并不是完美的答案。事实上,我不需要更新投票,我只是想帮点忙。其次,他在做“填充列表”这件事我以一种复杂的方式给了他做同样事情的简单代码,但你为什么不在答案中描述它,而不是在这里添加注释。刚刚测试了它,它又失败了:(@leythisham:post您的最新代码。我认为您正在使用contacts jsonArray而不是json从Arraywell获取价值。您100%正确,代码正在运行。非常感谢您的帮助。我看到了jsonArray和jsonObject现在的功能。刚刚对其进行了测试,但再次失败:(@leythisham:发布你的最新代码。我认为你是在使用联系人jsonArray而不是json从Arraywell获得价值。你说得100%对,代码现在可以工作了。非常感谢你的帮助。我知道你现在对jsonArray和jsonObject做了什么。