2012-10-13 26 views
20

個々のアイテムを取得するためにJSONObjectを解析する必要がある以下のコードです。私がJSONを使って作業しているのは初めてです。そのため、JSONObjectから個々のアイテムを取得するには、JSONObjectを解析する方法がわかりません。個々のアイテムを取得するためにJSONObjectを反復する方法

try { 
    String url = service + version + method + ipAddress + format; 
    StringBuilder builder = new StringBuilder(); 
    httpclient = new DefaultHttpClient(); 
    httpget = new HttpGet(url); 
    httpget.getRequestLine(); 
    response = httpclient.execute(httpget); 
    HttpEntity entity = response.getEntity(); 
    if (entity != null) { 
     InputStream inputStream = entity.getContent(); 
     bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     for (String line = null; (line = bufferedReader.readLine()) != null;) { 
      builder.append(line).append("\n"); 
     } 
     JSONObject jsonObject = new JSONObject(builder.toString()); 
     // Now iterate jsonObject to get Latitude,Longitude,City,Country etc etc. 

    } 

} catch (Exception e) { 
    getLogger().log(LogLevel.ERROR, e.getMessage()); 
} finally { 
    bufferedReader.close(); 
    httpclient.getConnectionManager().shutdown(); 
} 

私のJSONは次のようになります。

{ 
    "ipinfo": { 
     "ip_address": "131.208.128.15", 
     "ip_type": "Mapped", 
     "Location": { 
      "continent": "north america", 
      "latitude": 30.1, 
      "longitude": -81.714, 
      "CountryData": { 
       "country": "united states", 
       "country_code": "us" 
      }, 
      "region": "southeast", 
      "StateData": { 
       "state": "florida", 
       "state_code": "fl" 
      }, 
      "CityData": { 
       "city": "fleming island", 
       "postal_code": "32003", 
       "time_zone": -5 
      } 
     } 
    } 
} 

私は上記の目的からlatitudelongitudecitystatecountrypostal_codeを取得する必要があります。誰でも効率的に行う方法を提案することはできますか?

答えて

60

を使用して

JSONObject jsonObject = new JSONObject   (YOUR_JSON_STRING); 
JSONObject ipinfo  = jsonObject.getJSONObject ("ipinfo"); 
String  ip_address = ipinfo.getString   ("ip_address"); 
JSONObject location = ipinfo.getJSONObject  ("Location"); 
String  latitude = location.getString  ("latitude"); 
System.out.println (latitude); 

このサンプルコードあなたはそれが再帰的にマップとしてJSONオブジェクトや構築物中のすべてのキー値を見つけるでしょう、これを試すことができます。あなたはマップからあなたが望むキーを簡単に得ることができます。

public static Map<String,String> parse(JSONObject json , Map<String,String> out) throws JSONException{ 
    Iterator<String> keys = json.keys(); 
    while(keys.hasNext()){ 
     String key = keys.next(); 
     String val = null; 
     try{ 
      JSONObject value = json.getJSONObject(key); 
      parse(value,out); 
     }catch(Exception e){ 
      val = json.getString(key); 
     } 

     if(val != null){ 
      out.put(key,val); 
     } 
    } 
    return out; 
} 

public static void main(String[] args) throws JSONException { 

    String json = "{'ipinfo': {'ip_address': '131.208.128.15','ip_type': 'Mapped','Location': {'continent': 'north america','latitude': 30.1,'longitude': -81.714,'CountryData': {'country': 'united states','country_code': 'us'},'region': 'southeast','StateData': {'state': 'florida','state_code': 'fl'},'CityData': {'city': 'fleming island','postal_code': '32003','time_zone': -5}}}}"; 

    JSONObject object = new JSONObject(json); 

    JSONObject info = object.getJSONObject("ipinfo"); 

    Map<String,String> out = new HashMap<String, String>(); 

    parse(info,out); 

    String latitude = out.get("latitude"); 
    String longitude = out.get("longitude"); 
    String city = out.get("city"); 
    String state = out.get("state"); 
    String country = out.get("country"); 
    String postal = out.get("postal_code"); 

    System.out.println("Latitude : " + latitude + " LongiTude : " + longitude + " City : "+city + " State : "+ state + " Country : "+country+" postal "+postal); 

    System.out.println("ALL VALUE " + out); 

} 

出力:

Latitude : 30.1 LongiTude : -81.714 City : fleming island State : florida Country : united states postal 32003 
ALL VALUE {region=southeast, ip_type=Mapped, state_code=fl, state=florida, country_code=us, city=fleming island, country=united states, time_zone=-5, ip_address=131.208.128.15, postal_code=32003, continent=north america, longitude=-81.714, latitude=30.1} 
+5

良い答え。この場合、 'Map 'はうまく動作しますが、より一般的なものにするために、Map 'を実行します。 – Tavo

関連する問題