2012-01-30 2 views
1

Я хочу проанализировать адреса из ответа JSON (http://maps.googleapis.com/maps/api/geocode/json?address=public+library+san+diego & sensor = false), полученные от API геокодирования в мое приложение для Android.Как обработать ответ Json, полученный от API геокодирования (V3) в приложении для Android?

Может ли кто-нибудь помочь мне разобраться в ответе и отобразить его в виде списка?

Высоко цените вашу помощь.

ответ

0

Вы можете использовать gson для обработки ответа JSON.

Руководство пользователя gson дает примеры того, как это сделать, но в основном вам нужно будет создать класс Java, соответствующий структуре объекта ответа JSON.

Как только это будет сделано, вы должны иметь список адресных объектов в какой-либо форме или форме (например, вы можете просто использовать отформатированный адресный атрибут ответа), с помощью которого вы можете инициализировать ListAdapter.

0

Android содержит библиотеки json.org, поэтому довольно легко разобрать JSON на объекты. Существует очень краткий учебник по использованию JSON в Android here. После того, как вы проанализировали данные, вам просто нужно поместить их в адаптер для вашего ListView.

4

использовать следующие алго для анализа результата:

private ArrayList<InfoPoint> parsePoints(String strResponse) { 
     // TODO Auto-generated method stub 
     ArrayList<InfoPoint> result=new ArrayList<InfoPoint>(); 
     try { 
      JSONObject obj=new JSONObject(strResponse); 
      JSONArray array=obj.getJSONArray("results"); 
      for(int i=0;i<array.length();i++) 
      { 
          InfoPoint point=new InfoPoint(); 

       JSONObject item=array.getJSONObject(i); 
       ArrayList<HashMap<String, Object>> tblPoints=new ArrayList<HashMap<String,Object>>(); 
       JSONArray jsonTblPoints=item.getJSONArray("address_components"); 
       for(int j=0;j<jsonTblPoints.length();j++) 
       { 
        JSONObject jsonTblPoint=jsonTblPoints.getJSONObject(j); 
        HashMap<String, Object> tblPoint=new HashMap<String, Object>(); 
        Iterator<String> keys=jsonTblPoint.keys(); 
        while(keys.hasNext()) 
        { 
         String key=(String) keys.next(); 
         if(tblPoint.get(key) instanceof JSONArray) 
         { 
          tblPoint.put(key, jsonTblPoint.getJSONArray(key)); 
         } 
         tblPoint.put(key, jsonTblPoint.getString(key)); 
        } 
        tblPoints.add(tblPoint); 
       } 
       point.setAddressFields(tblPoints); 
       point.setStrFormattedAddress(item.getString("formatted_address")); 
       JSONObject geoJson=item.getJSONObject("geometry"); 
       JSONObject locJson=geoJson.getJSONObject("location"); 
       point.setDblLatitude(Double.parseDouble(locJson.getString("lat"))); 
       point.setDblLongitude(Double.parseDouble(locJson.getString("lng"))); 

       result.add(point); 
      } 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return result; 
    } 

код класса InfoPoint является:

import java.util.ArrayList; 
import java.util.HashMap; 

public class InfoPoint { 
    ArrayList<HashMap<String, Object>> addressFields=new ArrayList<HashMap<String, Object>>(); 
    String strFormattedAddress=""; 
    double dblLatitude=0; 
    double dblLongitude=0; 
    public ArrayList<HashMap<String, Object>> getAddressFields() { 
     return addressFields; 
    } 
    public void setAddressFields(ArrayList<HashMap<String, Object>> addressFields) { 
     this.addressFields = addressFields; 
    } 
    public String getStrFormattedAddress() { 
     return strFormattedAddress; 
    } 
    public void setStrFormattedAddress(String strFormattedAddress) { 
     this.strFormattedAddress = strFormattedAddress; 
    } 
    public double getDblLatitude() { 
     return dblLatitude; 
    } 
    public void setDblLatitude(double dblLatitude) { 
     this.dblLatitude = dblLatitude; 
    } 
    public double getDblLongitude() { 
     return dblLongitude; 
    } 
    public void setDblLongitude(double dblLongitude) { 
     this.dblLongitude = dblLongitude; 
    } 

} 
14

мне было интересно, вокруг решения на некоторое время, и это было своего рода трудно для меня, чтобы найти какое-то решение, основанное на поиске ключевого слова google, поэтому, поскольку я уже решил это, я решил поставить свое решение здесь.

Создать все модели GSon необходимо преобразовать из JSON в GeocodeResponse

public class GeocodeResponse { 
    private String status; 
    private List<Geocode> results = new ArrayList<Geocode>(); 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public void setResults(List<Geocode> results) { 
     this.results = results; 
    } 

    public List<Geocode> getResults() { 
     return results; 
    } 
} 


public class Geocode { 
    private Collection<String> types = new ArrayList<String>(); 
    private String formatted_address; 
    private Collection<AddressComponent> address_components = new ArrayList<AddressComponent>(); 
    private Geometry geometry; 
    private boolean partialMatch; 

    public Collection<String> getTypes() { 
     return types; 
    } 

    public void setTypes(Collection<String> types) { 
     this.types = types; 
    } 

    public void setFormatted_address(String formatted_address) { 
     this.formatted_address = formatted_address; 
    } 

    public String getFormatted_address() { 
     return formatted_address; 
    } 

    public void setAddress_components(Collection<AddressComponent> address_components) { 
     this.address_components = address_components; 
    } 

    public Collection<AddressComponent> getAddress_components() { 
     return address_components; 
    } 

    public Geometry getGeometry() { 
     return geometry; 
    } 

    public void setGeometry(Geometry geometry) { 
     this.geometry = geometry; 
    } 

    public boolean isPartialMatch() { 
     return partialMatch; 
    } 

    public void setPartialMatch(boolean partialMatch) { 
     this.partialMatch = partialMatch; 
    } 
} 

public class AddressComponent { 
    private String longName; 
    private String shortName; 
    private Collection<String> types = new ArrayList<String>(); 

    public String getLongName() { 
     return longName; 
    } 

    public void setLongName(String longName) { 
     this.longName = longName; 
    } 

    public String getShortName() { 
     return shortName; 
    } 

    public void setShortName(String shortName) { 
     this.shortName = shortName; 
    } 

    public Collection<String> getTypes() { 
     return types; 
    } 

    public void setTypes(Collection<String> types) { 
     this.types = types; 
    } 
} 

public class Geometry { 
    private Location location; 
    private String locationType; 
    private Area viewport; 
    private Area bounds; 

    public Location getLocation() { 
     return location; 
    } 

    public void setLocation(Location location) { 
     this.location = location; 
    } 

    public String getLocationType() { 
     return locationType; 
    } 

    public void setLocationType(String locationType) { 
     this.locationType = locationType; 
    } 

    public Area getViewport() { 
     return viewport; 
    } 

    public void setViewport(Area viewport) { 
     this.viewport = viewport; 
    } 

    public Area getBounds() { 
     return bounds; 
    } 

    public void setBounds(Area bounds) { 
     this.bounds = bounds; 
    } 
} 


public class Location { 
    private double lat; 
    private double lng; 

    public void setLat(double lat) { 
     this.lat = lat; 
    } 

    public double getLat() { 
     return lat; 
    } 

    public void setLng(double lng) { 
     this.lng = lng; 
    } 

    public double getLng() { 
     return lng; 
    } 
} 


public class Area { 
    private Location southWest; 
    private Location northEast; 

    public Location getSouthWest() { 
     return southWest; 
    } 

    public void setSouthWest(Location southWest) { 
     this.southWest = southWest; 
    } 

    public Location getNorthEast() { 
     return northEast; 
    } 

    public void setNorthEast(Location northEast) { 
     this.northEast = northEast; 
    } 
} 

Тогда попробуйте этот код:

@Service 
public class RestService { 
    private static final String URL = "http://maps.googleapis.com/maps/api/geocode/json?address={address}&sensor=false"; 

    @Autowired 
    private RestTemplate restTemplate; 

    public GeocodeResponse getMap(String address) { 
     Map<String, String> vars = new HashMap<String, String>(); 
     vars.put("address", address); 

     String json = restTemplate.getForObject(URL,String.class, vars); 

     return new Gson().fromJson(json, GeocodeResponse.class); 
    } 

} 

Надеется, что это помогает.

+0

Отличный ответ. Сохранял меня, по крайней мере, полчаса :) –

+1

Действительно хорошо, но поскольку json из Google может измениться в любое время. У нас есть лучшее решение? например: AddressComponent.longName теперь long_name. И ваш код больше не может получить longName. –

Смежные вопросы