1

これを使って簡単な JSON パーサーを作成しました。私がしたいのは、GoogleマップAPIを使用してビジネスの名前と緯度/経度を解析することだけですが、正しく解析できないようです。

JSON 結果の例:

"results" : [
  {
     "geometry" : {
        "location" : {
           "lat" : 41.8881090,
           "lng" : -87.6308430
        }
     },
     "name" : "American Bar Association",
  },
  {
     "geometry" : {
        "location" : {
           "lat" : 41.8721230,
           "lng" : -87.6294680
        }
     },
     "name" : "Bar Louie",
   
  } ], "status" : "OK"}

例を短くするために、興味のないその他の詳細をいくつか取り出しましたが、これが私のコードです。

            JSONParser jParse = new JSONParser();
            JSONObject json = jParse.getJSON(url);
    
            try
            {   
                JSONArray contacts = json.getJSONArray("results"); //Parent Node
                for(int i = 0; i < 5; i++)//Loop through first 5 results results            
                {
                    JSONObject c = contacts.getJSONObject(i);
                    name = c.getString("name");//Gets name field 
                    
                    //get lat from location which is a sub object of geometry                       
                    lat = Float.valueOf (contacts.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getString("lat")); 
                }
            } catch (JSONException e) { e.printStackTrace(); }

実行すると、最初の結果がうまく取得され、正しい名前と緯度が取得されますが、2 番目の結果に移動する代わりに、i の最後の結果に移動し、ループの残りの部分を出力します。説明するのは難しいですが、5 つの結果をループすると次のようになります。

  • Loop 1 Output: Result#1 //これでOK
  • Loop 2 Output: Results#5 //何らかの方法で #2 を取得する代わりに結果 #5 にスキップします
  • Loop 3 Output: Results#5 //残りのループで毎回 #5 を出力し続ける
  • ループ 4 出力: 結果 #5
  • ループ 5 出力: 結果 #5

forループを無視して最後の結果にたどり着く方法がわかりませんか?短いスニペットのために省略したトーストメッセージだけで結果を印刷しています。

(これを別のスレッドで実行し、ハンドラーを使用してトースト メッセージを表示していることに注意してください)

私はJavaがそれほど得意ではありません.JSONを扱うのは初めてなので、私が言ったかもしれない愚かなことを惜しまないでください. どんな助けでも大歓迎です。:)

4

2 に答える 2

0

私は自分の問題に答えることになりました。これは、ループを実行するたびにname変数を再利用し、ハンドラーが起動して終了するまでに、ループが既に終了した最初のメッセージを表示し、名前に最後の値を割り当てたためだと思います。したがって、他の4つのハンドラー要求が最終的に実行されると、同じ値が4回出力されます。

于 2012-09-14T22:14:37.437 に答える
0

こんにちは、あなたが言ったように3つのループだけであるべきなので、5つのループを理解できません。JSONファイルを扱うときに、同様の問題が発生しました。後で持っているオブジェクトの実数を印刷することをお勧めします

JSONArray contacts = json.getJSONArray("results");

私の問題は、配列に必要な要素 (連絡先 - 3 つのオブジェクトを入力する) があると思っていたのですが、実際には何か違うもの (ジオメトリ オブジェクトなど) を持っていたことです。

私がJSONを扱っていた言語では、結果は辞書なので、getJSONObjectを連結しないでください

contacts.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getString("lat")
于 2012-09-07T00:19:06.030 に答える