2012-10-13 198 views
20

Este es mi código de abajo del cual necesito analizar el JSONObject para obtener elementos individuales. Esta es la primera vez que trabajo con JSON. Así que no estoy seguro de cómo analizar JSONObject para obtener los elementos individuales desde JSONObject.¿Cómo puedo iterar JSONObject para obtener elementos individuales?

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(); 
} 

Mi JSON se ve así:

{ 
    "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 
      } 
     } 
    } 
} 

Necesito conseguir latitude, longitude, city, state, country, postal_code del objetivo anterior. ¿Alguien puede brindar alguna sugerencia de cómo hacerlo de manera eficiente?

Respuesta

60

Puede probar esta forma recursiva encontrará todos los valores clave en un objeto JSON y construcciones como un mapa. Simplemente puede obtener la clave que desea del Mapa.

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

} 

Salida:

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

Buena respuesta. Solo mencionaría que en este caso, 'Map ' funciona bien, pero para hacerlo más genérico, haría 'Map ', ya que algunos de los campos son numéricos. – Tavo

12

¿Qué tal esto?

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

Este código de ejemplo usando "org.json.JSONObject"

Cuestiones relacionadas