当php响应JSON错误

当php响应JSON错误

问题描述:

我有JSON的问题。当php响应JSON错误

我已经有了这个服务,连接到php并以json格式发送给我数据。 一切都好(几个月前),但今天我修改了一些小东西,不工作。

我添加了一个调用函数来简单地比较2个jSon数组,并创建另一个元素在一个中,但在其他中没有。

这是服务的代码:

public class GroupsTaskAlarmChecker extends Service implements Runnable { 

public void run() { 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
nameValuePairs.add(new BasicNameValuePair("role", role)); 

try 
{    
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://blablabla.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 
     noInternet=false; 

    }catch(Exception e){ 
      Log.e("log_tag", "Error in http connection "+e.toString()); 
      noInternet=true; 
    } 
    //convert response to string 
    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"); 
     } 
     is.close(); 

     result=sb.toString(); 

    }catch(Exception e){ 
     Log.e("log_tag", "Error converting result "+e.toString()); 
     noInternet=true; 
    } 

    jArray2= result; 
    mPrefs = getSharedPreferences(PREFS, 0); 

if (jArray2.equals(groupList) || noInternet) { 
    handler.sendEmptyMessage(NO_CHANGE); 
} 
else { 
    if (!noInternet) 
     { 
      try { 
       prepareForNewImage(jArray2); 
      } catch (JSONException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    Editor e = mPrefs.edit(); 
    e.putString("groupList", jArray2); 
    e.commit(); 
    handler.sendEmptyMessage(THERE_ARE_CHANGE); 
} 
} 

public void prepareForNewImage(String j) throws JSONException { 
    String gL = mPrefs.getString("groupList", null); 
    Log.e("string j",j); 
    String jA = ""; 
    jA=j; 
    if(!gL.equals(null)) { 
    JSONArray gL2 = new JSONArray(gL); 
    JSONArray jA2 = new JSONArray(jA); 
    boolean is = false; 
    for(int i=0;i<jA2.length();i++){ 
     JSONObject json_data2 = jA2.getJSONObject(i); 
     String gId_jA2=json_data2.getString("groupId"); 
     for(int k=0;i<gL2.length();k++){ 
      JSONObject json_data = gL2.getJSONObject(k); 
      String gId_gL2=json_data.getString("groupId"); 
      if (gId_gL2.equals(gId_jA2)) 
       is=true; 
     } 
     if (!is) 
     { 
      is=false; 
      newGroups.put(json_data2);   
     } 
    Log.i("loop","end of first loop"); 
    } 

     Editor e = mPrefs.edit(); 
     e.putString("newGroups", newGroups.toString()); 
     e.commit(); 
    } 
    } 

这是我的新的logcat:

03-06 15:44:54.243: W/System.err(19868): org.json.JSONException: End of input at character 0 of 
03-06 15:44:54.253: W/System.err(19868): at org.json.JSONTokener.syntaxError(JSONTokener.java:450) 
03-06 15:44:54.253: W/System.err(19868): at org.json.JSONTokener.nextValue(JSONTokener.java:97) 
03-06 15:44:54.253: W/System.err(19868): at org.json.JSONArray.<init> (JSONArray.java:87) 
03-06 15:44:54.253: W/System.err(19868): at org.json.JSONArray.<init>(JSONArray.java:103) 
03-06 15:44:54.253: W/System.err(19868): at com.org.tfc_android.GroupsTaskAlarmChecker.prepareForNewImage(GroupsTaskAlarmChecker.java:162) 
03-06 15:44:54.253: W/System.err(19868): at com.org.tfc_android.GroupsTaskAlarmChecker.run(GroupsTaskAlarmChecker.java:139) 
03-06 15:44:54.253: W/System.err(19868): at java.lang.Thread.run(Thread.java:856) 

有人能帮助我吗?先谢谢你。

+0

你的数组比较实现是天真的。它的复杂度是o(n²)。 groupid(o(log(n))上的两个数组,允许您进行ao(n)比较(如果g1 [i] == g2 [k] => add; else if g1 [i] i ++; else如果g1 [i]> g2 [k] => k ++;) – njzk2 2013-03-06 14:02:25

+0

谢谢你@ njzk2。你说得对,我会在有时间之后做出来的,谢谢 – carlosdiazp 2013-03-06 17:56:05

您在这里flubbed索引检查:

for(int k=0;i<gL2.length();k++){
------------^

您应该使用k,不i。在附注中,你有很多重复的代码,你可能会从你的代码中收集(例如,重复调用mPrefs = getSharedPreferences(PREFS, 0);

+0

你对变量k。 我也有删除多个mPrefs = getSharedPreferences(PREFS,0);除了第一个,感谢它 但仍然错误JSONException:在字符0的输入结束 ,它似乎在t他的行: JSONArray gL2 = new JSONArray(gL); 这就是我在我的函数中创建新的Json的第一行。 你知道为什么可以这样吗? :/ – carlosdiazp 2013-03-06 14:50:31

+0

您需要验证您从偏好类中获取的字符串('String gL = mPrefs.getString(“groupList”,null);'),以验证它是否为空。 – Perception 2013-03-06 14:53:54

+0

你说得对。 我有if(!gL.equals(null))而不是if(!gL.equals(“”)),并且因为之前(在其他活动中)​​我将该SharedPreferences初始化为“”而错误。 此外,我错误的FORS循环,因为我从来没有把变量“is”为假,然后永远不会进入IF,因为(除了另一个逻辑错误),我的变量JSONArray newGroups总是空的。 非常感谢您的帮助@Perception – carlosdiazp 2013-03-06 22:21:09