2013-02-19 207 views
0

请帮我找到这段代码中的错误。 我想从化JSON远程服务器(PHP & MySQL的)一些数据,然后解析它 问题是结果回报,但它应该是这个链接返回http://codeincloud.tk/json_android_example.phpjson解析错误

package com.shadatv.shada; 

import java.io.IOException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
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.AsyncTask; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.widget.Toast; 

public class canticlesActivity extends Activity { 

    TextView httpStuff; 
    HttpClient client; 
    JSONObject json; 

    final static String URL = "http://codeincloud.tk/json_android_example.php"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.canticles); 

     httpStuff = (TextView) findViewById(R.id.textView1); 
     client = new DefaultHttpClient(); 
     new Read().execute("name"); 
    } 

    public JSONObject lastTweet() throws ClientProtocolException, IOException, JSONException { 
     StringBuilder url = new StringBuilder(URL); 

     HttpGet get = new HttpGet(url.toString()); 
     HttpResponse r = client.execute(get); 
     int status = r.getStatusLine().getStatusCode(); 

     if (status == 200) { 
      HttpEntity e = r.getEntity(); 
      String data = EntityUtils.toString(e); 
      JSONArray timeline = new JSONArray(data); 
      JSONObject last = timeline.getJSONObject(0); 
      return last; 

     } else { 
      Toast.makeText(getBaseContext(), "error", Toast.LENGTH_SHORT); 
      return null; 
     } 
    } 

    public class Read extends AsyncTask<String, Integer, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generated method stub 

      try { 
       json = lastTweet(); 
       return json.getString(params[0]); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getBaseContext(), "ahmed .. " + result, Toast.LENGTH_LONG).show(); 
      httpStuff.setText(result); 
     } 

    } 
} 
+1

你可以粘贴一些像StackStraces的LogCat输出吗? – Droidman 2013-02-19 11:07:18

+0

你为什么试图解析JSONArray中的Json对象? – njzk2 2013-02-19 11:11:03

回答

0

复制并过去现在它正在工作。 我改变了JSONObject last = new JSONObject(data);

因为http://codeincloud.tk/json_android_example.php重新调整的JSONObject的

package com.shadatv.shada; 

import java.io.IOException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
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.AsyncTask; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.widget.Toast; 

public class canticlesActivity extends Activity { 

    TextView httpStuff; 
    HttpClient client; 
    JSONObject json; 

    final static String URL = "http://codeincloud.tk/json_android_example.php"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.canticles); 

     httpStuff = (TextView) findViewById(R.id.textView1); 
     client = new DefaultHttpClient(); 
     new Read().execute("name"); 
    } 

    public JSONObject lastTweet() throws ClientProtocolException, IOException, JSONException { 
     StringBuilder url = new StringBuilder(URL); 

     HttpGet get = new HttpGet(url.toString()); 
     HttpResponse r = client.execute(get); 
     int status = r.getStatusLine().getStatusCode(); 

     if (status == 200) { 
      HttpEntity e = r.getEntity(); 
      String data = EntityUtils.toString(e); 

      JSONObject last = new JSONObject(data); 
      return last; 

     } else { 
      Toast.makeText(getBaseContext(), "error", Toast.LENGTH_SHORT); 
      return null; 
     } 
    } 

    public class Read extends AsyncTask<String, Integer, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generated method stub 

      try { 
       json = lastTweet(); 
       return json.getString(params[0]); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getBaseContext(), "ahmed .. " + result, Toast.LENGTH_LONG).show(); 
      httpStuff.setText(result); 
     } 

    } 
} 
+0

谢谢,它现在正在工作 – 2013-02-19 12:36:23

+0

还有另一个问题,如果我想要接收像这样的json数组,我该怎么办:http://dt-works.com/ags/shadatv/canticles/android_data 怎么可以我修改它? – 2013-02-19 12:37:27

1

解析当前JSON字符串为:

HttpEntity e = r.getEntity(); 
String data = EntityUtils.toString(e); 
// convert data to json object 
JSONObject last =new JSONObject(data); 

因为当前webservic e仅重新调整JSONObject而不是JSONArray

1

您的网址提供了以下数据:

{ “名”:即 “Froyo”, “版本”: “Android 2.2的”}

的代码解析JSON的块如下:

 JSONArray timeline = new JSONArray(data); 
     JSONObject last = timeline.getJSONObject(0); 

这使得您正在阅读的JSON文档是一个数组而不是一个对象。 (或者是有效的JSON,但是你提取的文档很明显是一个Object)。 Web服务调用可能并不总是返回一个或另一个,所以你必须小心,你正在解析正确的类型。