2016-03-29 3 views
1

私がアクセスしているAPIの下のJSON出力を使用して、長い都市名「Southwest Portland」にアクセスするにはどうすればよいですか?オブジェクトや配列が非常に深くネストされているため、問題が発生しています。JSONの完全な配列/オブジェクトから文字列を抽出するのに役立つ

JSON:ここ

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "3229-3353", 
       "short_name" : "3229-3353", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Southwest Dolph Court", 
       "short_name" : "SW Dolph Ct", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Southwest Portland", 
       "short_name" : "Southwest Portland", 
       "types" : [ "neighborhood", "political" ] 
      }, 
      { 
       "long_name" : "Portland", 
       "short_name" : "Portland", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Multnomah County", 
       "short_name" : "Multnomah County", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Oregon", 
       "short_name" : "OR", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "97219", 
       "short_name" : "97219", 
       "types" : [ "postal_code" ] 
      } 
     ], 

は、以下のことをコーディングの私の15+の試みの一つです。毎回、私は何か違うものを手に入れます。私は非常に近いです、私はちょうどすべてのアドレスの構成要素がそのタイトルにlong_nameとshort_nameを持っているので、どのように近所の名前を引き出すかを考え出すことができません。ご協力ありがとうございました!

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 

    try { 

     String message = ""; 
     JSONObject jsonObject = new JSONObject(result); 
     String JSONresults = jsonObject.getString("results"); 
     Log.i("JSON content", JSONresults); 
     JSONArray arr = new JSONArray(JSONresults); 

     for (int i = 0; i < arr.length(); i++) { 

      JSONObject jsonPart = arr.getJSONObject(i); 
      String neighborhoodLong = ""; 
      String neighborhoodShort = ""; 
      neighborhoodLong = jsonPart.getString("long_name"); 
      neighborhoodShort = jsonPart.getString("short_name"); 

      if (neighborhoodLong != "" && neighborhoodShort != "") { 
       message += neighborhoodLong + ": " + neighborhoodShort; 
      } 
     } 

     if (message != "") { 

      Log.i("neigh", message); 
      //insert succesful code here 
     } else { 
      //unsuccesful code goes here 
     } 

    } catch (JSONException e) { 
      //error code here 
    } 



} 
+0

文字列を比較するために '.equals(Object)'を使用してください。 –

+0

これはうまくいくでしょうが、近傍が変わり、それが何であるか常に分かっていません。基本的に私は座標を入れて、GoogleのAPIは私に近所の名前を教えてくれます。私は近くの名前にアクセスしようとしているので、私はそれを私のアプリに表示することができます – user3552105

答えて

1

ここに行きます。あなたが理解できるように、コードをよくコメントしました。

try 
      { 
        //This is the whole thing 
        JSONObject Jresult = new JSONObject(result); 
        //Now we take the JSONarray results 
        JSONArray Results = Jresult.getJSONArray("results"); 
        //IMPORTANT 
        //Now we have to take the object in the array. 
        //Since there is only 1 obj. You dont need a for loop 
        JSONObject ResObj = Results.getJSONObject(1); 
       //Now we get the array address_components 
        JSONArray addressComps = ResObj.getJSONArray("address_components"); 
        //Time to get the obj we want from the array 
        //Since u mentioned only thst one name and provided the result 
        //I knew the number in the array. In this case 3. 
        JSONObject needed = addressComps.getJSONObject(3); 
        //Now we get the required string 
        String longName = needed.getString("long_name"); 
      } 
      catch (JSONException e) 
      {} 

いくつかの重要なことに注意してください。 私は配列内のオブジェクトの位置を知っていたので、forループは使用しませんでした。しかし、別の状況でそれを扱うなら、forループを使うことができます。あなたはすでにそれを知っています。

また、私はjsonの文字列名が間違っている可能性があります。あなたが知っているのは、識別名です。だから場合は、ダブルチェックしてください。これがあなたに役立つことを願っています

+0

感謝します!これははるかに簡単な方法です。私は他のいくつかのロケールでテストしましたが、それは常に3番目の配列項目ですから、この答えは間違いなく機能します。コードを文書化していただきありがとうございます。 – user3552105

+0

ありがとうございます。それがうまくいったら私に教えてください。また、JSONを処理する際にこれらの例外のすべてにログを追加したい場合、クラッシュすることはありませんが、単に何もしません。希望も役立ちます –

0

文字列がヌルまたは空であるかどうかを確認する使用アンドロイドTextUtils、。

if (neighborhoodLong != "" && neighborhoodShort != "") { 
    message += neighborhoodLong + ": " + neighborhoodShort; 
} 
if (message != "") { 
    ... 
}  

をして:

は交換してみ

if (!TextUtils.isEmpty(neighborhoodLong) && !TextUtils.isEmpty(neighborhoodShort)) { 
    message += neighborhoodLong + ": " + neighborhoodShort; 
} 
if (!TextUtils.isEmpty(message)) { 
    ... 
} 

また、あなたが正しく解析していないようです。 "address_components"はjson配列なので、ここには2つの配列があります。あなたのforループで試してみてください:

JSONObject jsonPart = arr.getJSONObject(i); 
JSONArray address_components = jsonPart.getJsonArray("address_components"); 

希望に役立ちます!

1

あなたは配列の配列を持っています。しかし、あなたは1つのfor loopだけでは不十分です。 あなたは最初の配列の中に入ると別の配列を反復処理する必要がある -

for (int i = 0; i < arr.length(); i++) { 

       JSONArray internalArray = arr.getJSONObject(i).getJSONArray("address_components"); 
       for (int index = 0; index < internalArray.length(); index++) { 
        String neighborhoodLong = ""; 
        String neighborhoodShort = ""; 
        JSONObject jsonPart = internalArray.getJSONObject(index); 
        JSONArray typeArray = jsonPart.getJSONArray("types"); 
      for(int counter =0 ; counter< typeArray.length(); counter++){ 
       if(typeArray.getString(counter).equalsIgnoreCase("neighborhood")){ 
        neighborhoodLong = jsonPart.getString("long_name"); 
        neighborhoodShort = jsonPart.getString("short_name"); 

        if (!TextUtils.isEmpty(neighborhoodLong) && !TextUtils.isEmpty(neighborhoodShort)) { 
         message += neighborhoodLong + ": " + neighborhoodShort; 
        } 
        break; 
       } 
      } 
       } 
      if (!TextUtils.isEmpty(message)) { 

      Log.i("neigh", message); 
      //insert succesful code here 
     } else { 
      //unsuccesful code goes here 
     } 

    } catch (JSONException e) { 
      //error code here 
    } 

・ホープ、このことができます!

+0

答えは "近所"の世話をするために編集しました –

+1

Shookran!だから私はそれを理解することができなかった、私は別の配列を行うとは思わなかった。私は近づいてうれしいです。私を助けてくれてありがとう! – user3552105

+0

@ user3552105問題なく動作しましたか?しかし、私の答えで指摘したように、2番目の配列を含む最初の配列の中にオブジェクトはありませんか? –

関連する問題