2012-10-13 15 views
20

这是我下面的代码从我需要解析JSONObject获得单个项目。这是我第一次使用JSON。所以不知道如何解析JSONObjectJSONObject获取单个项目。我如何可以循环的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

你可以试试这个它会递归找到一个JSON对象中的所有键值和结构的地图此示例代码。你可以简单地从Map中获得你想要的密钥。

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

很好的回答。我只想提的是,在这种情况下,'地图'只是罚款,而是使之更通用的,我会做'地图<字符串,对象>',因为一些字段是数字。 – Tavo

12

这个怎么样?

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

使用"org.json.JSONObject"

相关问题