0

嗨,我有时会收到此 JsonException ... 为什么会发生这种情况,任何机构都可以解决以下问题,这是我的代码。

  public int getResult(String name, double lat, double lon) {
        try {
            HttpClient httpclient = new DefaultHttpClient();
            String query = URLEncoder.encode(name, "utf-8");

            HttpPost httppost = new HttpPost("http://00004rl.rcomhost.com/demo/?json=get_dealing&dev=1&store_name=" + query + "&longitude=" + lon
                    + "&latitude=" + lat);
            JSONObject object = new JSONObject();
            StringEntity se = new StringEntity(object.toString());
            se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
            httppost.setEntity(se);
            HttpResponse response = httpclient.execute(httppost);
            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();
            JSONObject jso = new JSONObject(sb.toString());
            if (jso.getString("status").equals("ok")) {
                return 1;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
        return 0;
    }

我正在低于异常,这是我的 logcat 低于

   09-25 19:13:26.079: W/System.err(4842): org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject
   09-25 19:13:26.079: W/System.err(4842):  at org.json.JSON.typeMismatch(JSON.java:107)
   09-25 19:13:26.079: W/System.err(4842):  at org.json.JSONObject.<init>(JSONObject.java:158)
   09-25 19:13:26.079: W/System.err(4842):  at org.json.JSONObject.<init>(JSONObject.java:171)
   09-25 19:13:26.079: W/System.err(4842):  at com.eheuristics.android.diegodeals.googleplacesandmaps.MainActivity$LoadPlaces.getResult(MainActivity.java:246)
   09-25 19:13:26.079: W/System.err(4842):  at com.eheuristics.android.diegodeals.googleplacesandmaps.MainActivity$LoadPlaces.doInBackground(MainActivity.java:208)
   09-25 19:13:26.079: W/System.err(4842):  at com.eheuristics.android.diegodeals.googleplacesandmaps.MainActivity$LoadPlaces.doInBackground(MainActivity.java:1)
   09-25 19:13:26.079: W/System.err(4842):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
   09-25 19:13:26.079: W/System.err(4842):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
  09-25 19:13:26.089: W/System.err(4842):   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
   09-25 19:13:26.089: W/System.err(4842):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
   09-25 19:13:26.089: W/System.err(4842):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
  09-25 19:13:26.089: W/System.err(4842):   at java.lang.Thread.run(Thread.java:1019)

我没有尝试过很多组合,但似乎google-gson保持JSON.

此处删除了一个示例,因为它不再相关

我从以前的项目经验中知道它是非常可定制的,例如如果基础对象不够,可以使用GsonBuilder创建更复杂的适配器。

但是,我尚未使用您的用例对此进行广泛测试,但是检查它是否具有预期的输出应该很简单

更新

而不是使用 SVN/CVS 来检查您的文件是否被修改,我发现 GSON 具有内置的版本控制支持,这可能会或可能不会解决您的问题,来自他们的文档:

使用@Since注解可以维护同一对象的多个版本。此注释可用于类、字段以及在未来版本中的方法。为了利用此功能,您必须将 Gson 实例配置为忽略任何大于某个版本号的字段/对象。如果没有在 Gson 实例上设置版本,那么它将序列化和反序列化所有字段和类,而不管版本如何。

更新

我能想到的唯一另一件事是用rhino解析您的外部文件并将JSON.stringify解析后的文件转换JSON回字符串,然后您可以确定它已通过单个“解析器”运行并且输出不会有所不同。

然后,您可以检测任何可能的更改。

4

4 回答 4

3

您的服务器有时会以 html 格式向您发送响应,而不是 json 格式。

于 2012-09-25T14:20:23.320 回答
0

结果似乎有问题。JSON您应该在构建对象之前尝试打印结果。

如果在某个地方出现错误,然后由于某种原因导致结果是 HTML 页面,那么您将无法构建您的JSON.

对于这个错误,看起来结果是 HTML,<!DOCTYPE而不是 JSON。

于 2012-09-25T14:22:06.497 回答
0

问题是您将服务器响应作为 JSON 处理,这是您的预期行为。但是在某些情况下,例如服务器已关闭,请求错误,服务器正忙……有人定义了一个 UncaughtException 处理程序,以通过某些 GUI 指示用户出现问题,有时服务器会返回。如果您在某处读取服务器响应,您实际上可以复制它并尝试在某些 HTML 页面查看器中运行它以获得确切的服务器响应......

于 2013-05-17T08:29:56.210 回答
0

似乎 SDK 级别 25 会出现此错误,但 SDK 级别 23 可以正常工作。

于 2016-12-21T07:21:58.700 回答