How to Parse Json reponse received from Geocoding API (V3) in android application?

StackOverflow https://stackoverflow.com/questions/9059184

  •  20-04-2021
  •  | 
  •  

Вопрос

I want to parse the addresses from the JSON response (http://maps.googleapis.com/maps/api/geocode/json?address=public+library+san+diego&sensor=false) received from Geocoding API in my android application.

Can anyone help me out on how to parse the response and display it in a list view?

Highly appreciate your help.

Это было полезно?

Решение

You can use gson to handle the JSON response.

The gson user guide gives examples of how to do this, but basically you will need to create a Java class that matches the structure of the JSON response object.

Once this is done you should have a list of address objects in some shape or form (for example you might just use the formatted address attribute of the response) with which you can initialize your ListAdapter.

Другие советы

I was wondering around the solution for a while and it was kind of difficult for me to find some solution based on google keyword search, so since I already solved it I decided to put my solution here.

Create all model GSon needs to convert from json to 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;
    }
}

Then try this code:

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

}

Hope it helps.

use following algo to parse result:

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

code for class InfoPoint is:

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

}

Android includes the json.org libraries, so it's pretty easy to parse JSON into objects. There is a very brief tutorial on using JSON in Android here. Once you've parsed the data you'll just need to put it in an adapter for your ListView.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top