Java 如何使用AsyncTask解析JSON?
我试图解析此JSON站点中的一些字符串: 我使用asynctask编写了以下代码:Java 如何使用AsyncTask解析JSON?,java,android,json,Java,Android,Json,我试图解析此JSON站点中的一些字符串: 我使用asynctask编写了以下代码: package com.example.nortti.jsonexample; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget
package com.example.nortti.jsonexample;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends Activity {
TextView txView;
//URL to get JSON Array
private static String url = "http://localhost:10101/api/stats/1";
//JSON Node Names
private static final String TAG_USER = "";
private static final String TAG_NAME = "PersonName";
private static final String TAG_EMAIL = "Rank";
JSONArray user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
user = null;
new JSONParse().execute();
}
private class JSONParse extends AsyncTask<String, String, JSONObject> {
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
txView = (TextView)findViewById(R.id.txView);
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Getting Data ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected JSONObject doInBackground(String... args) {
JSONParser jParser = new JSONParser();
// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url);
return json;
}
@Override
protected void onPostExecute(JSONObject json) {
pDialog.dismiss();
try {
// Getting JSON Array
user = json.getJSONArray("ArrayOfCommonStatViewModel");
Toast.makeText(getApplication(),user.toString(),Toast.LENGTH_SHORT).show();
JSONObject c = user.getJSONObject(0);
// Storing JSON item in a Variable
String name = c.getString(TAG_NAME);
String email = c.getString(TAG_EMAIL);
//Set JSON Data in TextView
txView.setText(name+" " +email);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
但是它说我有一个NullPointerException
我想获取一个JSONArray来获取信息,并将其放入列表视图中
UPD:这是JSON截图
UPD2:完整日志
12-17 14:17:03.712 20308-20308/com.example.nortti.politrange E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.nortti.politrange, PID: 20308
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:44)
at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:102)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:373)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:225)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:178)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at com.example.nortti.politrange.utils.WebApiAdapter.select(WebApiAdapter.java:33)
at com.example.nortti.politrange.intefaces.impls.PersonCatalog.populateData(PersonCatalog.java:37)
at com.example.nortti.politrange.views.GeneralFragment.listData(GeneralFragment.java:65)
at com.example.nortti.politrange.views.GeneralFragment.onClick(GeneralFragment.java:88)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19761)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5253)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
如果您试图用JSON解析器解析XML文档,它将无法工作。让我们看一看Link,它将告诉你如何正确地解析一个XML文档(在Android环境中):你试图用JSON解析器解析XML文档,它不起作用。让我们看看链接,它将告诉您如何正确地解析XML文档(在Android环境中): ,而不是开发整个解析代码,尝试使用谷歌的凌空库,这是一个<代码>异步代码< /代码>库,用于解析<代码> JSON<代码>。
这是一个很好的方法。不要开发整个解析代码,而是尝试使用谷歌的Volley
库,它是一个用于解析JSON
的异步
库。
这是一个很好的解决方案。您将获得NetworkOrMainThreadException
将下面的代码放在onCreate()上:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
希望这将对您有所帮助。您将获得网络或InthreadException
将下面的代码放在onCreate()上:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
希望这将对您有所帮助。您将获得一个NetworkMainThread异常,因为您正在UI线程中实现一个网络操作,所以要从本地主机加载json数据,您需要为它实现一个单独的线程您将获得一个NetworkMainThread异常,因为您是在UI线程中实现网络操作,因此要从本地主机加载json数据,您需要为其实现单独的线程您尝试解析的内容实际上是xml
而不是json
。如果需要执行网络请求,请解析JSON
,您可以使用库。它非常简单,没有麻烦。这是一个很好的教程。希望有帮助。您试图解析的内容实际上是xml
而不是JSON
。如果需要执行网络请求,请解析JSON
,您可以使用库。它非常简单,没有麻烦。这是一个很好的教程。希望能有帮助
enter code here
////在android studio中添加http客户端和http核心库/////
类mytask扩展了AsyncTask{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
String url = "http://192.168.1.13/mywebservice/getbook.php";
json = getJSONFromUrl(url);
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(ctx, json, Toast.LENGTH_LONG).show();
parser_01();
}
}
// from url to json object starts.......................................
public String 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");
sb.append(line);
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
return json;
}
// from url to json object Ends.......................................
public void parser_01() {
try {
String jstring = json;
JSONObject jobject = new JSONObject(jstring);
JSONArray bookarray = jobject.getJSONArray("data");
for (int i = 0; i < bookarray.length(); i++) {
String isdn = bookarray.getJSONObject(i).getString("isdn") + "";
String title = bookarray.getJSONObject(i).getString("title") + "";
String author = bookarray.getJSONObject(i).getString("author") + "";
String price = bookarray.getJSONObject(i).getString("price") + "";
}
} catch (Exception e) {
// TODO: handle exception
}
}
@覆盖
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
字符串url=”http://192.168.1.13/mywebservice/getbook.php";
json=getJSONFromUrl(url);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
Toast.makeText(ctx,json,Toast.LENGTH_LONG).show();
解析器_01();
}
}
//从url到json对象开始。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
公共字符串getJSONFromUrl(字符串url){
//发出HTTP请求
试一试{
//defaultHttpClient
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(url);
HttpResponse HttpResponse=httpClient.execute(httpPost);
HttpEntity HttpEntity=httpResponse.getEntity();
is=httpEntity.getContent();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
试一试{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
is,“iso-8859-1”),8);
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
//sb.附加(第+行“n”);
某人附加(行);
}
is.close();
json=sb.toString();
}捕获(例外e){
Log.e(“缓冲区错误”,“错误转换结果”+e.toString());
}
返回json;
}
//从url到json对象结束。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
公共空解析器_01(){
试一试{
字符串jstring=json;
JSONObject jobject=新的JSONObject(jstring);
JSONArray bookarray=jobject.getJSONArray(“数据”);
对于(int i=0;i
////在android studio中添加http客户端和http核心库/////
类mytask扩展了AsyncTask{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
String url = "http://192.168.1.13/mywebservice/getbook.php";
json = getJSONFromUrl(url);
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(ctx, json, Toast.LENGTH_LONG).show();
parser_01();
}
}
// from url to json object starts.......................................
public String 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");
sb.append(line);
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
return json;
}
// from url to json object Ends.......................................
public void parser_01() {
try {
String jstring = json;
JSONObject jobject = new JSONObject(jstring);
JSONArray bookarray = jobject.getJSONArray("data");
for (int i = 0; i < bookarray.length(); i++) {
String isdn = bookarray.getJSONObject(i).getString("isdn") + "";
String title = bookarray.getJSONObject(i).getString("title") + "";
String author = bookarray.getJSONObject(i).getString("author") + "";
String price = bookarray.getJSONObject(i).getString("price") + "";
}
} catch (Exception e) {
// TODO: handle exception
}
}
@覆盖
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
字符串url=”http://192.168.1.13/mywebservice/getbook.php";
json=getJSONFromUrl(url);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
Toast.makeText(ctx,json,Toast.LENGTH_LONG).show();
解析器_01();
}
}
//从url到json对象开始。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
公共字符串getJSONFromUrl(字符串url){
//发出HTTP请求
试一试{
//defaultHttpClient
默认httpClient httpClient=