Java:在字符串中解析多个Json对象

时间:2012-05-03 14:01:12

标签: java php json

我正在尝试解析来自我的webservice的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代码片段......

    $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格式

4 个答案:

答案 0 :(得分:4)

看起来你正在返回3个单独的结果。所以,有些可能......

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

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

    然后遍历数组的每个子节点以获得lat / long。

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

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

    请注意,我们首先替换所有内容,以便我们可以将}{保留在每个结果的开头/结尾。


  3. 更好的办法是修复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数组。

答案 1 :(得分:3)

您的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);

这应输出正确的格式。

答案 2 :(得分:1)

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创建JSONObject。

答案 3 :(得分:0)

我不确定webservice响应是否是格式正确的JSON,这可能是问题?

如果您有办法编辑应用程序生成的字符串,您可以尝试以下内容:

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