2012-06-11 28 views
0

我在Active.com上使用他们的API进行搜索,目前我的搜索停滞在这个错误:org.json.JSONException:在字符0输入结束。我是新手,任何帮助表示赞赏。疑难解答JSONException:在字符0输入结束

MainActivity

 private class SearchTask extends AsyncTask<String, Integer, String> 
{ 
    ProgressDialog dialog; 

     @Override 
     protected void onPreExecute() { 

      dialog = ProgressDialog.show(StayActiveActivity.this,"","Please Wait..."); 

      super.onPreExecute(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      try { 
       String result = ActiveHelper.download(params [0]); 
       return result; 
      } catch (ApiException e) { 
       e.printStackTrace(); 
       Log.e("alatta", "Problem making search request"); 
      } 
      return ""; 
     } 
     @Override 
     protected void onPostExecute(String result) { 

      try { 
       JSONObject obj = new JSONObject(result); 
       m_results = obj.getJSONArray("results"); 
       if (m_results == null || m_results.length() == 0) 
       { 
        Toast.makeText(getApplicationContext(), 
          "No Results found for " + m_search_text.getText(), 
          Toast.LENGTH_LONG).show(); 

       } 
       else 
        m_search_results.setAdapter(new JSONAdapter(getApplicationContext())); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

private class JSONAdapter extends BaseAdapter 
{ 
    public JSONAdapter(Context c){ 

    } 

    public int getCount() 
    { 
    return m_results.length(); 
     } 

    public Object getItem(int arg0){ 
     return null; 
    } 

    public long getItemId(int pos){ 
     return pos; 

    } 

    public View getView(int pos, View convertView, ViewGroup parent) { 
     View tv; 
     TextView t; 

     if (convertView == null) 
      tv = m_inflater.inflate (R.layout.item, parent, false); 
     else 
      tv = convertView; 
     try { 
      /* For each entry in the ListView, we need to populate 
      * its text and timestamp */ 
      t = (TextView) tv.findViewById(R.id.text); 
      JSONObject obj = m_results.getJSONObject(pos); 

      t.setText (obj.getString("event") + ": " + 
         obj.getString("text")); 

      t = (TextView) tv.findViewById(R.id.created_at); 
      t.setText (obj.getString("created_at")); 
     } catch (JSONException e) { 

      Log.e("alatta", e.getMessage()); 
     } 
     return tv; 
    } 

    } 

ActiveHelper

public class ActiveHelper { 

private static final String ACTIVE_SEARCH = "http://api.amp.active.com/search?&v=json&api_key=rm4agnjv6k4m4tvpft95xvbn"; 
    private static final int HTTP_STATUS_OK = 200; 
    private static byte[] buff = new byte[1024]; 



public static class SearchException extends Exception { 
     public SearchException (String msg) 
     { 
      super (msg); 
     } 

     public SearchException (String msg, Throwable thr) 
     { 
      super (msg, thr); 
     } 
} 
     protected static synchronized String download (String parm) 
       throws SearchException 
      { 
       String url = ACTIVE_SEARCH+ parm; 
       HttpClient client = new DefaultHttpClient(); 
       HttpGet request = new HttpGet(url); 
       try { 
        HttpResponse response = client.execute(request); 
        StatusLine status = response.getStatusLine(); 
        if (status.getStatusCode() != HTTP_STATUS_OK) 
         throw new SearchException("Invalid response from search.active.com" + 
           status.toString()); 
        HttpEntity entity = response.getEntity(); 
        InputStream ist = entity.getContent(); 
        ByteArrayOutputStream content = new ByteArrayOutputStream(); 
        int readCount = 0; 
        while ((readCount = ist.read(buff)) != -1) 
         content.write(buff, 0, readCount); 
        return new String (content.toByteArray()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
        throw new SearchException("Problem using the API", e); 
       } 
      } 
     } 

堆栈跟踪

06-11 15:01:27.569: E/alatta(7698): Problem making search request 
06-11 15:01:27.569: W/System.err(7698): org.json.JSONException: End of input at character 0 of 
06-11 15:01:27.569: W/System.err(7698):  at org.json.JSONTokener.syntaxError(JSONTokener.java:446) 
06-11 15:01:27.569: W/System.err(7698):  at org.json.JSONTokener.nextValue(JSONTokener.java:93) 
06-11 15:01:27.569: W/System.err(7698):  at org.json.JSONObject.<init>(JSONObject.java:154) 
06-11 15:01:27.569: W/System.err(7698):  at org.json.JSONObject.<init>(JSONObject.java:171) 
06-11 15:01:27.569: W/System.err(7698):  at my.stayactive.plan.StayActiveActivity$SearchTask.onPostExecute(StayActiveActivity.java:120) 
06-11 15:01:27.569: W/System.err(7698):  at my.stayactive.plan.StayActiveActivity$SearchTask.onPostExecute(StayActiveActivity.java:1) 
06-11 15:01:27.569: W/System.err(7698):  at android.os.AsyncTask.finish(AsyncTask.java:417) 
06-11 15:01:27.569: W/System.err(7698):  at android.os.AsyncTask.access$300(AsyncTask.java:127) 
06-11 15:01:27.579: W/System.err(7698):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
06-11 15:01:27.579: W/System.err(7698):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-11 15:01:27.579: W/System.err(7698):  at android.os.Looper.loop(Looper.java:150) 
06-11 15:01:27.579: W/System.err(7698):  at android.app.ActivityThread.main(ActivityThread.java:4293) 
06-11 15:01:27.579: W/System.err(7698):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-11 15:01:27.579: W/System.err(7698):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-11 15:01:27.579: W/System.err(7698):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
06-11 15:01:27.579: W/System.err(7698):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
06-11 15:01:27.579: W/System.err(7698):  at dalvik.system.NativeStart.main(Native Method) 
+0

你的问题提到了一个'JSONException',但你所发布的代码都没有实际执行任何JSON处理。 – Squonk

+0

对不起,更新。 –

+0

如果您从异常中发布实际堆栈跟踪将会很有帮助。从你的描述中,听起来你的HTTP请求的结果是返回一个空字符串。您也可以考虑使用EntityUtils.toString方法,而不是自己进行字符串转换:http://developer.android.com/reference/org/apache/http/util/EntityUtils.html#toString%28org.apache.http。 HttpEntity%29 – twaddington

回答

1

onPostExecute(...)我认为你需要使用_resultsJSONArray,而不是results的名字......

m_results = obj.getJSONArray("results"); // Change to "_results" 
+0

试过但仍然得到相同的响应。 –

+0

@ Noble6:啊,好的。在你的'下载'metod尝试'返回新的字符串(content.toByteArray(),“UTF-8”);' - 第二个参数指定编码。 – Squonk

+0

运气不好。想知道如果搜索网址是一个问题,API指定搜索网址为http://api.amp.active.com/search?k=marathon&v=json&api_key=rm4agnjv6k4m4tvpft95xvbn其中k =马拉松搜索参数。如果我尝试URL +参数,我会得到错误。 –

0

你确定你所得到的结果回来?在获得JSONObject之前,您可以通过发送Toast消息来进行验证。通常,只有当响应为空或空白时才会引发此错误。尽管通过浏览器访问API返回结果可能会阻止它在您正在测试的环境中获得响应。