我想解析从Geocoding API收到的JSON响应(http://maps.googleapis.com/maps/api/geocode/json?address=public+library+san+diego&sensor=false)中的地址在我的Android应用程序中。
有人可以帮我解决如何解析响应并在列表视图中显示它吗?
非常感谢您的帮助。
答案 0 :(得分:15)
我对这个解决方案感到疑惑了一段时间,我很难找到一些基于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);
}
}
希望它有所帮助。
答案 1 :(得分:3)
使用以下算法来解析结果:
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;
}
}
答案 2 :(得分:0)
您可以使用gson来处理JSON响应。
gson用户指南提供了如何执行此操作的示例,但基本上您需要创建一个与JSON响应对象的结构相匹配的Java类。
完成此操作后,您应该拥有某个形状或形式的地址对象列表(例如,您可能只使用响应的格式化地址属性),您可以使用它来初始化ListAdapter。
答案 3 :(得分:0)
Android包含json.org库,因此将JSON解析为对象非常容易。有关在Android here中使用JSON的简短教程。一旦解析了数据,您只需将其放入ListView的适配器中即可。