1

WebサービスからのJson応答を解析しようとしています。この文字列をWebサーバーから受け取ります。

{"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");

上記のコードを試してみると、適切なlongitudecordは30.13689であり、適切なlatitudecordは-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

4 に答える 4

4

3つの別々の結果を返しているようです。だから、いくつかの可能性...

  1. 文字列をJSONArrayに形成し、それを解析します...

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

    次に、配列の各子を反復処理して、緯度/経度を取得します。

  2. 返された文字列を個別の結果文字列に分割し、それらを個別に解析します。多分このようなもの...

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

    各結果の開始/終了時に}とを保持できるように、最初にAllを置換することに注意してください。{


より良いのは、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配列に解析され、反復処理できるようになります。

于 2012-05-03T14:12:17.693 に答える
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);

これにより、正しい形式が出力されます。

于 2012-05-03T14:10:44.370 に答える
1

JSONObjectは、文字列を表す最初のJSONのみを取得します。これを行うことによって:

JSONObject jsonObj = new JSONObject(jsonStr);

オブジェクトには、最初のjsonが含まれることになります。

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

したがって、別のjsonオブジェクトに関するデータを取得しようとすると、指定したキーが見つかりません。なんらかの方法で文字列を解析する必要があります。次のようなことを行うとうまくいくと思います。

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

そうすれば、文字列の配列ができあがり、それぞれに個別のjsonが含まれます。後でそれぞれを使用してJSONObjectを作成できます。

于 2012-05-03T14:23:51.160 に答える
0

Webサービスの応答が適切にフォーマットされたJSONであるかどうかわかりませんが、これが問題になる可能性がありますか?

アプリによって生成されている文字列を編集する手段がある場合は、次のような方法を試すことができます。

[
{"lon0":"30.13689","lat0":"-96.3331183333333"},
{"lon1":"30.136965","lat1":"-96.33252"},
{"lon2":"30.1370383333333","lat2":"-96.3319233333333"}
]
于 2012-05-03T14:13:36.853 に答える