我正在构建一个将 json 从数据库解析为列表视图的应用程序。我已使用 PHP 脚本将数据库中的数据编码为以下 JSON 格式:
[
{"id":"1","artistname":"Rihanna"},
{"id":"2","artistname":"Katy Perry"},
{"id":"3","artistname":"DJ Dibs"},
{"id":"4","artistname":"Jamie Foxx"},
{"id":"5","artistname":"Disclosure"}
]
这是解析器类,它以字符串形式返回上述数据:
package com.example.jsontester;
public class JsonParser {
static InputStream is = null;
static JSONObject jsonObject = null;
static String data = "";
public JsonParser() {
}
public String getJSONFromUrl(String url) {
// Making HTTP request
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
catch (UnsupportedEncodingException exception) {
exception.printStackTrace();
} catch (ClientProtocolException exception) {
exception.printStackTrace();
} catch (IOException exception) {
exception.printStackTrace();
}
//Gets the JSON String
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sBuilder = new StringBuilder();
String line = null;
//Appends the string to the line
while ((line = reader.readLine()) != null) {
sBuilder.append(line + "\n");
}
is.close();
data = sBuilder.toString();
}
catch (Exception exception) {
exception.printStackTrace();
}
return data;
}
}
这是使用图表项创建列表视图的活动
package com.example.jsontester;
public class JsonActivity extends ListActivity{
private ProgressDialog progressDialog;
// JSON Node names
private static final String TAG_ITEM = "item";
private static final String TAG_ID = "id";
private static final String TAG_ARTISTNAME = "artistname";
// chartItemList is the array list that holds the chart items
ArrayList<HashMap<String, Integer>> chartItemList =
new ArrayList<HashMap<String, Integer>>();
JsonParser Parser = new JsonParser();
// JSONArray
JSONArray chartItems = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progressdialog);
//url from where the JSON has to be retrieved
String url = <<http://127.0.0.1/mmcv/>>;
//Check if the user has a connection
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null) {
if (!info.isConnected()) {
Toast.makeText(this,
"Please check your connection and try again.", Toast.LENGTH_SHORT).show();
}
//if positive, fetch the articles in background
else new getChartItems().execute(url);
}
//else show toast
else {
Toast.makeText(this, "Please check your connection and try again.",
Toast.LENGTH_SHORT).show();
}
}
class getChartItems extends AsyncTask<String, String, String> {
// Shows a progress dialog while executing background task
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(JsonActivity.this);
progressDialog.setMessage("Loading chart...");
progressDialog.setIndeterminate(false);
progressDialog.setCancelable(false);
progressDialog.show();
}
//Gets the json data for chart items data and presents it in a list view
@Override
protected String doInBackground(String... args) {
String url = <<http://127.0.0.1/mmcv>>;
String json = Parser.getJSONFromUrl(url);
System.out.println("Json should be below me");
System.out.println(json);
int id;
String artistname;
try{
chartItems = new JSONArray(json);
JSONObject json_data=null;
for(int i=0;i<chartItems.length();i++){
json_data = chartItems.getJSONObject(i);
artistname=json_data.getString("TAG_ARTISTNAME");
id=json_data.getInt("TAG_ID");
HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
// adding each child node to HashMap key => value
hashMap.put(artistname,id);
// adding HashMap to ArrayList
chartItemList.add(hashMap);
}
}
catch (JSONException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
public void run() {
//updating list view with the parsed items
ListAdapter adapter = new SimpleAdapter(JsonActivity.this, chartItemList,
R.layout.listview,
new String[] { TAG_ID, TAG_ARTISTNAME }, new int[] {R.id.id,
R.id.artistname });
setListAdapter(adapter);
}
});
return null;
}
//Removes the progress dialog when the data has been fetched
protected void onPostExecute(String args) {
progressDialog.dismiss();
}
}
}
这是日志猫:
01-19 15:45:49.816: D/libEGL(29490): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
01-19 15:45:49.867: W/System.err(29490): org.apache.http.conn.HttpHostConnectException: Connection to
(http://127.0.0.1) refused
01-19 15:45:49.898: D/libEGL(29490): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
01-19 15:45:49.902: D/libEGL(29490): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
01-19 15:45:49.914: W/System.err(29490): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183)
01-19 15:45:49.918: W/System.err(29490): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-19 15:45:49.925: W/System.err(29490): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-19 15:45:49.925: W/System.err(29490): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-19 15:45:49.925: W/System.err(29490): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-19 15:45:49.925: W/System.err(29490): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-19 15:45:49.929: W/System.err(29490): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-19 15:45:49.929: W/System.err(29490): at com.example.jsontester.JsonParser.getJSONFromUrl(JsonParser.java:36)
01-19 15:45:49.929: W/System.err(29490): at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:83)
01-19 15:45:49.929: W/System.err(29490): at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:1)
01-19 15:45:49.933: W/System.err(29490): at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-19 15:45:49.933: W/System.err(29490): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-19 15:45:49.933: W/System.err(29490): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-19 15:45:49.933: W/System.err(29490): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-19 15:45:49.933: W/System.err(29490): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-19 15:45:49.937: W/System.err(29490): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-19 15:45:49.937: W/System.err(29490): at java.lang.Thread.run(Thread.java:856)
01-19 15:45:49.937: W/System.err(29490): Caused by: java.net.ConnectException: failed to connect to /<<127.0.0.1>> (port 80): connect failed: ECONNREFUSED (Connection refused)
01-19 15:45:49.941: W/System.err(29490): at libcore.io.IoBridge.connect(IoBridge.java:114)
01-19 15:45:49.941: W/System.err(29490): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-19 15:45:49.945: W/System.err(29490): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
01-19 15:45:49.945: W/System.err(29490): at java.net.Socket.connect(Socket.java:842)
01-19 15:45:49.945: W/System.err(29490): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
01-19 15:45:49.957: W/System.err(29490): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
01-19 15:45:49.957: D/OpenGLRenderer(29490): Enabling debug mode 0
01-19 15:45:49.957: W/System.err(29490): ... 16 more
01-19 15:45:49.961: W/System.err(29490): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
01-19 15:45:49.972: W/System.err(29490): at libcore.io.Posix.connect(Native Method)
01-19 15:45:49.992: W/System.err(29490): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
01-19 15:45:49.992: W/System.err(29490): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-19 15:45:49.992: W/System.err(29490): at libcore.io.IoBridge.connect(IoBridge.java:112)
01-19 15:45:49.992: W/System.err(29490): ... 21 more
01-19 15:45:49.992: W/System.err(29490): java.lang.NullPointerException
01-19 15:45:49.996: W/System.err(29490): at java.io.Reader.<init>(Reader.java:64)
01-19 15:45:49.996: W/System.err(29490): at java.io.InputStreamReader.<init>(InputStreamReader.java:79)
01-19 15:45:50.000: W/System.err(29490): at com.example.jsontester.JsonParser.getJSONFromUrl(JsonParser.java:51)
01-19 15:45:50.000: W/System.err(29490): at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:83)
01-19 15:45:50.007: W/System.err(29490): at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:1)
01-19 15:45:50.011: W/System.err(29490): at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-19 15:45:50.011: W/System.err(29490): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-19 15:45:50.023: W/System.err(29490): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-19 15:45:50.031: W/System.err(29490): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-19 15:45:50.031: W/System.err(29490): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-19 15:45:50.035: W/System.err(29490): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-19 15:45:50.035: W/System.err(29490): at java.lang.Thread.run(Thread.java:856)
01-19 15:45:50.039: I/System.out(29490): Json should be below me
01-19 15:45:50.050: W/System.err(29490): org.json.JSONException: End of input at character 0 of
01-19 15:45:50.125: W/System.err(29490): at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
01-19 15:45:50.152: W/System.err(29490): at org.json.JSONTokener.nextValue(JSONTokener.java:97)
01-19 15:45:50.152: W/System.err(29490): at org.json.JSONArray.<init>(JSONArray.java:87)
01-19 15:45:50.152: W/System.err(29490): at org.json.JSONArray.<init>(JSONArray.java:103)
01-19 15:45:50.152: W/System.err(29490): at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:92)
01-19 15:45:50.152: W/System.err(29490): at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:1)
01-19 15:45:50.156: W/System.err(29490): at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-19 15:45:50.156: W/System.err(29490): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-19 15:45:50.156: W/System.err(29490): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-19 15:45:50.156: W/System.err(29490): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-19 15:45:50.156: W/System.err(29490): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-19 15:45:50.156: W/System.err(29490): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-19 15:45:50.156: W/System.err(29490): at java.lang.Thread.run(Thread.java:856)