【问题标题】:JSON error when php responsesphp响应时出现JSON错误
【发布时间】:2013-03-06 13:31:17
【问题描述】:

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)

有人可以帮助我吗?提前谢谢你。

【问题讨论】:

  • 您的数组比较实现是幼稚的。它的复杂度是o(n²)。我会在 groupid (o(log(n)) 上对两个数组进行排序,这样您就可以进行 o(n) 比较(如果 g1[i] == g2[k] => add; else if g1[i] i++; else if g1[i] > g2[k] => k++;)
  • 谢谢@njzk2。你说得对,如果我有时间我会再做。谢谢。

标签: java android json arrays jsonexception


【解决方案1】:

你在这里弄错了你的索引检查:

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

您应该使用k,而不是i。附带说明一下,您可能会从代码中收集到很多重复的代码(例如,对mPrefs = getSharedPreferences(PREFS, 0); 的重复调用。

【讨论】:

  • 您对变量 k 的看法是正确的。我也删除了多个 mPrefs = getSharedPreferences(PREFS, 0);除了第一个。谢谢你。但仍然出现错误 JSONException: end of input at character 0 of 并且似乎在这一行: JSONArray gL2 = new JSONArray(gL);这是我在函数中创建新 Json 的第一行。你知道为什么会这样吗? ://
  • 您需要验证从首选项类 (String gL = mPrefs.getString("groupList", null);) 返回的字符串,以验证它不为空。
  • 你是对的。我有 if(!gL.equals(null)) 而不是 if(!gL.equals("")) 并且是错误的,因为之前(在其他活动中)​​我将 SharedPreferences 初始化为“”。此外,我在 FORS 循环中错了,因为我从未将变量“is”设置为 false,然后从未进入 IF,并且因为(除了另一个逻辑错误),我的变量 JSONArray newGroups 始终为空。非常感谢您的帮助@Perception
  • 没问题!祝项目的其余部分好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多