【问题标题】:Android JSON Exception End of InputAndroid JSON 异常输入结束
【发布时间】:2013-02-27 00:56:45
【问题描述】:

我尝试解析 JSON 对象已经有一段时间了。这里有很多类似的问题,但是没有一个有效的答案。我的代码都不是机密的,所以我在这里发布。

公共类 JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        //HttpPost httpPost = new HttpPost(url);
            HttpGet httpget = new HttpGet(url);
        HttpResponse httpResponse = httpClient.execute(httpGet);
        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, "UTF-8"));
              //  is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;

        while ((line = reader.readLine()) != null) {

            sb.append(line);
        }
        is.close();


        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        JSONTokener tokener = new JSONTokener(json);
        jObj = new JSONObject(tokener);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}

}

*edited Get 是必需的,而不是 Post

【问题讨论】:

  • 尝试 UTF-8 和/或不要在 sb.append 中添加 \n
  • 先不要加\n,JSON没有换行
  • @Shehabix,这不是正确的原因。 JSON 可以根据需要包含尽可能多的空格以使其可读。但是,在上面的代码中,不能保证 readLine 在适当的换行符处返回整行,因为源 url 似乎没有换行符。
  • @323go 是的,你是对的,我的意思是在内容内部而不是在对象之间。
  • 我将解析类编辑为建议,但仍像以前一样收到输入错误字符 0 的结尾。也编辑了问题中的代码。

标签: android html json parsing input


【解决方案1】:

我制作了一个小测试应用程序并运行它。 HTTPPost 不返回任何内容,但如果将其切换为 HTTPGet,则会得到有效响应。

之后,数组中的第一个元素缺少“名称”,因此当您调用c.getString("name") 时,会生成一个 JSONException,看起来您只是在外部块中捕获。您需要为每个 getString 调用添加一些异常处理,可能类似于:

String name = null;
try {
name = c.getString("name");
} catch(JSONException e) {
//name is missing!
name = "";
}

【讨论】:

  • 昨晚发现了这个,但不让我发帖提问。这确实是问题所在。此外,名称位于内部对象中,必须单独解析。感谢您的意见!
  • 不客气。请接受我的正确回答,或者如果您想提供更多详细信息,您可以回答您自己的问题并接受您的正确回答。无论哪种方式,接受您正确回答的问题的答案都是一种很好的形式。
【解决方案2】:

不确定你的有什么问题,但也许与我一直在使用它的作品进行比较。我会说我有输入字符 0 错误,这是一个 SERVER SIDE 错误,而不是我的解析。这意味着返回的数据可能无法在 JSON 对象中编码。如果我没记错的话,我认为我的服务器没有返回任何内容,我基本上是在尝试解析nothing。我会验证您从服务器获取的内容。

String result;
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("key", "value");
nameValuePairs.add(new BasicNameValuePair("key2", "value2");

try
{
    HttpClient httpclient = new DefaultHttpClient();

            // URL to POST to
    HttpPost httpreq = new HttpPost("www.sample.com/file.php");
    httpreq.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httpreq);
    HttpEntity entity = response.getEntity();
    InputStream is = entity.getContent();

    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();
            /* if you print 'result' you should see valid data 
               if your server is working */
            // System.out.println(result); 
}
catch (Exception e)
{
    // handle what went wrong
}

JSONArray jArray = new JSONArray(result);

if (jsonArray != null)
{
   for (int i = 0; i < jsonArray.length(); i++)
   {
       JSONObject json_data;
       try
       {
           json_data = jsonArray.getJSONObject(i);
           String value = json_data.getString("json_key_here");                
       }
       catch (JSONException e)
       {
            // handle what went wrong
       }
   }
}

【讨论】:

  • 在我尝试将字符串解析为 json 对象之前,代码不会出错。在那之前我放了一个字符串结果的日志,它没有打印,所以它确实是空的。然而,已经有一个 ios 应用程序使用了这个特定的 json 提要,所以我不认为问题可能出在服务器端......
【解决方案3】:

我不明白您为什么要获取实体,将其转换为 BufferedReader 一次读取实体的一行,将其转换为字符串,将字符串转换为 JSONTokener,然后最后使用标记器创建 JSONObject。

这里有一个更简单的方法:

String entityString = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
JSONObject json = new JSONObject(entityString);

如果抛出异常,则使用输出捕获它:

} catch (Exception e) {
    e.printStackTrace();
}

并向我们展示那条痕迹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2016-10-04
    • 1970-01-01
    • 2021-03-05
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多