0

我有一个 php 文件,用于将 json 格式的信息发送到 android,这是 php 文件的代码:

<?php

$host="localhost";
$user="root";
$pass="";
$dbname="ltc";

$type=$_GET['type'];



$con= mysql_connect($host,$user,$pass);
$BD= mysql_select_db($dbname, $con);

$query=mysql_query("select * from posts where type='".$type."'");
$num=mysql_num_rows($query);


if($num>=1)
{
    while($list=mysql_fetch_assoc($query))
    {

        $output=$list;
        echo json_encode($output);
    }
        mysql_close();
    }
    else
    {
    echo "error";
    }
?>

发送到android的信息如下:

{"IDpost":"1","username":"you","FirstN":"Mounzer","LastN":"Yaghi","Content":"test1","Type":"CARS","Dateofp":"2013-03-03"}{"IDpost":"2","username":"boss","FirstN":"Marwan","LastN":"Geha","Content":"test2\r\n","Type":"CARS","Dateofp":"2013-03-05"}

现在在android中,我正在尝试使用json数组填充一些信息的listview,android中的代码是:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class Posts extends Activity {
String type,firstname,lastname,email,number,username,content;   
HttpClient httpclient;
HttpPost httppost;
ArrayList<NameValuePair> nameValuePairs;
HttpResponse response;
HttpEntity entity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        Bundle gotBasket=getIntent().getExtras();
        type=gotBasket.getString("type_post");
       this.setTitle(type);

        setContentView(R.layout.addpost);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

 httpclient = new DefaultHttpClient();
 httpclient = new DefaultHttpClient();
 httppost = new HttpPost("http://192.168.1.38/LTC/Uploadposts.php?type="+type+"");
 try{
 nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("type",type));
nameValuePairs.add(new BasicNameValuePair("FirstN",firstname));
nameValuePairs.add(new BasicNameValuePair("LastN",lastname));
nameValuePairs.add(new BasicNameValuePair("Content",content));

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
response = httpclient.execute(httppost);



 if(response.getStatusLine().getStatusCode()==200)
 {

 entity=response.getEntity();
 if(entity !=null)
 {
    InputStream instream=entity.getContent();
 JSONObject jsonResponse = new JSONObject(convertStreamToString(instream));
 //Toast.makeText(getBaseContext(),jsonResponse.toString(),Toast.LENGTH_LONG).show();
 String retUser=jsonResponse.getString("username");
 String retcont=jsonResponse.getString("Content");
 String getf=jsonResponse.getString("FirstN");
String getl=jsonResponse.getString("LastN");
String dop=jsonResponse.getString("Dateofp");




try {
    JSONArray jArray = new JSONArray("["+jsonResponse.toString()+"]");

    int jArrayLength = jArray.length();
    List<String> listContents = new ArrayList<String>(jArrayLength);

    for(int i =0; i<jArray.length(); i++){

        JSONObject json_data = jArray.getJSONObject(i);
        listContents.add(json_data.getString("FirstN")+" "+json_data.getString("LastN")+"                   "+json_data.getString("Dateofp")+"\n\n"+json_data.getString("Content"));

    }

    ListView myListView = (ListView) findViewById(R.id.listView2);
    myListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listContents));

}catch(JSONException e){
    Log.e("log_tag","Error parsin data "+e.toString());
}

 }}

 }//End of first try

 catch(Exception e)
 {
     Toast.makeText(getBaseContext(), e.toString(),Toast.LENGTH_LONG).show();

 } // End of first catch



    } //End of oncreate bundle



      private static String convertStreamToString(InputStream is)
       {


       BufferedReader reader = new BufferedReader(new InputStreamReader(is));
       StringBuilder sb = new StringBuilder();
       String line = null;
       try
       {

       while ((line = reader.readLine()) != null) {
           sb.append(line + "\n");
       }
       }catch(IOException e)
       {
        e.printStackTrace();
       }
       finally
       {
        try{
            is.close();
        }catch(IOException e)
        {
            e.printStackTrace();
        }
        }return sb.toString();



       }


} //End of Class

关键是,只有数据库表的第一行正在填充列表视图,我的意思是只有列表视图中的第一项正在填充,它应该是两个项目(数据库表中的 2 行)有什么帮助吗?

4

2 回答 2

0

只需移出json_encode街区while

$output = array();
while ($list = mysql_fetch_assoc($query)) {
    $output[] = $list;
}

echo json_encode($output);

因此,您将所有数据填充到数组中,然后在循环后一次全部发送。

于 2013-03-09T16:36:15.247 回答
0

好吧,您从我上面看到的内容中返回了无效的 json。执行dfsq在 php 代码中所说的操作。在此之后,在您的 java 代码中,您可以将 json 字符串转换为 JSONArray,并且通过使用 getJSONObject 方法,您可以访问数组中的每个对象。

JSONArray jsonArray = new JSONArray(convertStreamToString(instream));
int length = jsonArray.length();

for (int i=0; i < length; i++) {
    JSONObject row = jsonArray.getJSONObject(i);

    // Do whatever you want to do with the row object here
}
于 2013-03-09T17:04:17.707 回答