【问题标题】:Exception when trying to parse JSON from a MySQL query尝试从 MySQL 查询解析 JSON 时出现异常
【发布时间】:2012-05-30 02:28:09
【问题描述】:

我在用 Java 解析来自 MySQL 的 JSON 响应时遇到问题。

try {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://parkfinder.zxq.net/default.php");
    httppost.setEntity(new UrlEncodedFormEntity(coordinatesToSend));
    HttpResponse response = httpclient.execute(httppost);
    Log.d("HTTP Client", "HTTP Request made");

    HttpEntity entity = response.getEntity();
    inputStream = entity.getContent();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,
            "iso-8859-1"), 8);
    sb = new StringBuilder();
    sb.append(bufferedReader.readLine() + "\n");

    String line = "0";
    while ((line = bufferedReader.readLine()) != null) {
        sb.append(line + "\n");
    }
    inputStream.close();
    bufferedReader.close();
    result = sb.toString();
    Log.d("RESULT", result);
    JSONObject json_data = new JSONObject(result);
    Log.d("JSON","Finished");
    JSONArray nameArray = json_data.names();
    JSONArray valArray = json_data.toJSONArray(nameArray);
    for (int i = 0; i < nameArray.length(); i++) {
        Log.d("NAMES", nameArray.getString(i));
    }
    for (int i = 0; i < nameArray.length(); i++) {
        Log.d("NAMES", nameArray.getString(i));
    }

} catch (Exception e) {
    // TODO: handle exception
}

这是 MySQL Accessing and retreiving info, and parsing it afterwars。

Log.d("RESULT", result);

行发布正确的结果:

2[{"longtitude":"32.32","latitude":"33.12"}]

然而

Log.d("JSON","Finished");

永远不会被调用, 所以问题似乎出在这一行

JSONObject json_data = new JSONObject(result);

这件事取自一个教程,我在互联网上和这个网站上看到了很多例子,有些错误,但不是这个。

任何帮助都会很棒! 谢谢

编辑: printStackTrace() 输出:

0`5-14 21:38:18.639: WARN/System.err(665): org.json.JSONException: A JSONObject text must begin with '{' at character 1 of 2[{"longtitude":"32.32","latitude":"33.12"}]`

php代码:

<?php
$host = "localhost";
$user = "**MASKED**";
$password = "**MASKED**";
$database = "parkfinder_zxq_coordinates";
$connection = mysql_connect($host, $user, $password) or die("couldn't connect to server");
$db = mysql_select_db($database, $connection) or die("couldn't select database.");
//$request_parked = $_REQUEST['parked'];
$request_long = $_REQUEST['longtitude'];
$request_lat = $_REQUEST['latitude'];
//if ($request_parked == 'FIND') {
$q = mysql_query("SELECT * FROM Coordinates");
while ($e = mysql_fetch_assoc($q))
    $output[] = $e;

print (json_encode($output));
//}

mysql_close();
?>

【问题讨论】:

  • 所以很可能解析失败,抛出异常,并且你的异常处理程序是空白的,所以什么也没有发生......完成那个“TODO”并且至少让catch块吐出异常错误文本。
  • 添加 e.printStackTrace();到你的catch

标签: java php mysql json


【解决方案1】:

您的 JSON 数据 2[{"longtitude":"32.32","latitude":"33.12"}] 无效(数字 2 不是正确的 JSON 语法)。

我可以建议你的意思吗

[{"longtitude":"32.32","latitude":"33.12"}]`

(即开头没有2

您可以使用http://jsonlint.com/ 的验证器来检查您的 JSON 代码。

【讨论】:

  • 我添加了PHP代码,我没有对从mysql获得的输出进行任何修改
  • 好吧,2 是您的异常跟踪表明 JSON 代码无效的地方,它肯定不会在 jsonlint.com 处解析。 2 来自哪里 - 它是从您的 MySQL 返回还是来自您的 HTML 连接?我会建议也许 MySQL 是正确的,但您的 HTML 阅读代码出于某种原因添加了 2?
  • 我粘贴的是整个 php 文件。它没有任何html接口,它仅用于与设备交互。知道 php 有什么问题吗?
  • 我认为您的 PHP 没有问题,我认为您的 Java 代码有问题。
  • 不要使用 BufferedReader 来读取 HttpEntity 内容,为什么不尝试摆脱所有手动读取代码而只使用 String result = EntityUtils.toString(entity); - 它完成了读取内容的所有艰苦工作你。它可能有助于消除潜在的错误来源。本课程详情请参考hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/…
猜你喜欢
  • 2018-03-06
  • 2018-04-30
  • 1970-01-01
  • 2014-07-29
  • 2018-08-11
  • 2013-03-25
  • 2021-12-28
  • 1970-01-01
  • 2016-05-26
相关资源
最近更新 更多