【问题标题】:Java: Parsing more than one Json Object in a stringJava:在一个字符串中解析多个 Json 对象
【发布时间】:2012-05-13 01:31:53
【问题描述】:

我正在尝试解析来自我的网络服务的 Json 响应。我从我的网络服务器收到这个字符串。

{"lon0":"30.13689","lat0":"-96.3331183333333"}{"lon1":"30.136965","lat1":"-96.33252"}{"lon2":"30.1370383333333","lat2":"-96.3319233333333"}

我将它放入一个名为 jsonStr.. 的字符串中。 然后我将它放入一个对象中。并获取我需要的字符串。

JSONObject jsonObj = new JSONObject(jsonStr);//place it into an object
String longitudecord = jsonObj.getString("lon0");//retrieve the lon0
String latitudecord = jsonObj.getString("lat0");

当我尝试上面的代码时,我得到正确的经度线是 30.13689,​​正确的纬度线是 -96.3331183333333。

但是当我运行它时

    String longitudecord = jsonObj.getString("lon1");
String latitudecord = jsonObj.getString("lat1");

我没有得到正确的经度和纬度。它抛出一个异常。所以我不认为我试图正确获得“lon1”和“lat1”。

谁能帮我解决这个问题?

***更新***** ** 我的 php 代码 sn-p...

    $counter = 0;
// read them back
$result = mysql_query( "SELECT * FROM locations" );
while( $data = mysql_fetch_assoc($result) ) {
$latFromDb = $data['latitude'];
$longFromDb = $data['longitude'];
$variable = array( 'lon'.$counter => "$longFromDb", 'lat'.$counter => "$latFromDb" );
    // One JSON for both variables
echo json_encode($variable);
$counter++;
}

我怎样才能返回正确的 json 格式

【问题讨论】:

  • 请将您的标题更新为更具描述性的标题(每个可用的 JSON 字符串都不止“{}”...)
  • 我建议将 json 字符串形成为对象数组 [{},{},...]
  • 那是有效的 JSON 字符串吗?我不确定……
  • {}{} 不是有效的 JSON。见json.org
  • 无效的 JSON。看起来用户请求了 4 个单独的 lat/logs,它们被附加到一个字符串中,而不是形成一个数组。

标签: java php json


【解决方案1】:

您的 jsonStr 无效,每条记录之间缺少括号和逗号。使用:

[
    {
        "lon0": "30.13689",
        "lat0": "-96.3331183333333"
    },
    {
        "lon1": "30.136965",
        "lat1": "-96.33252"
    },
    {
        "lon2": "30.1370383333333",
        "lat2": "-96.3319233333333"
    }
]

PHP:

$sth = mysql_query("SELECT latitude,longitude FROM locations");
$rows = array();
while($r = mysql_fetch_assoc($sth)) {
    $rows[] = $r;
}
echo json_encode($rows);

这应该输出正确的格式。

【讨论】:

  • 你能看到我的 ****Update****,我的 php 代码在那里。我想弄清楚如何像你说的那样显示它们。
  • 看看这个link。您需要将字符串编码为 lon 和 lat 对象的数组。
【解决方案2】:

您似乎返回了 3 个单独的结果。所以,一些可能性......

  1. 将字符串形成一个 JSONArray,然后解析它...

    JSONArray jsonObj = new JSONArray("["+jsonStr.replaceAll("}{","},{")+"]");

    然后遍历数组的每个子元素以获取纬度/经度。

  2. 将返回的字符串拆分成单独的结果字符串,并单独解析它们。也许是这样的......

    String[] results = jsonStr.replaceAll("}{","}}{{").split("}{");

    请注意,我们先替换所有,因此我们可以在每个结果的开头/结尾保留 }{


最好的办法是修复您的 PHP 服务器代码。你基本上只需要一个 [ 开头,] 结尾,, 在每个结果之间。我认为这样的事情可能会做到(请为我修正语法 - 我不是 PHP 编码器)。

    $counter = 0;
// read them back
$result = mysql_query( "SELECT * FROM locations" );
echo '[';
while( $data = mysql_fetch_assoc($result) ) {
if (&counter >= 1){
  echo ',';
}
$latFromDb = $data['latitude'];
$longFromDb = $data['longitude'];
$variable = array( 'lon'.$counter => "$longFromDb", 'lat'.$counter => "$latFromDb" );
    // One JSON for both variables
echo json_encode($variable);
$counter++;
}
echo ']';

一旦你知道了,你应该可以说new JSONArray(serverResult),它会将你所有的结果解析成一个你可以迭代的JSON数组。

【讨论】:

  • 我尝试了第二个,第一个和我在调试 '05-03 14:45:10.452: E/AndroidRuntime(476): java.util.regex.PatternSyntaxException: Syntax 时得到了这一行索引 1 附近的错误 U_REGEX_RULE_SYNTAX:}{'
  • 抱歉,您需要通过这样做来转义字符...replaceAll("\}\{","}}{{")。我已经编辑了我的答案。
  • 你在 Eclipse 中的最新更新说:无效的转义序列(有效的是 \b \t \n \f \r \" \' \\ )
  • 臭虫,我不认为 { 和 } 需要转义,所以对您的原始评论感到惊讶。不太确定它有什么问题:-(。我看到你已经用 PHP 代码编辑了你原来的问题——这绝对是解决问题的正确方法!
  • 我已经编辑了我的答案以包括应该使其成为 JSON-proper 的 PHP 更改。
【解决方案3】:

我不确定 Web 服务响应的 JSON 格式是否正确,这可能是问题所在?

如果您有办法编辑您的应用生成的字符串,您可以尝试以下操作:

[
{"lon0":"30.13689","lat0":"-96.3331183333333"},
{"lon1":"30.136965","lat1":"-96.33252"},
{"lon2":"30.1370383333333","lat2":"-96.3319233333333"}
]

【讨论】:

  • 你能看到我的更新吗,我的php代码在那里。我想弄清楚如何像你说的那样显示它们。
【解决方案4】:

JSONObject 只会采用字符串中出现的第一个 JSON。通过这样做:

JSONObject jsonObj = new JSONObject(jsonStr);

您的对象最终将包含第一个 json:

{"lon0":"30.13689","lat0":"-96.3331183333333"}

因此,当您尝试获取有关另一个 json 对象的数据时,它不会找到您指定的键。您必须以某种方式解析字符串,我认为这样做可能会起作用:

String separatedJsons= jsonStr.replace("}{", "}###{");
String jsons[] = separatedJsons.split("###");

这样你最终会得到一个字符串数组,每个字符串都有单独的 jsons。您可以稍后为每个 JSONObject 创建。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多