Android编程实现根据经纬度查询地址并对获取的json数据进行解析的方法
程序员文章站
2023-12-17 09:43:16
本文实例讲述了android编程实现根据经纬度查询地址并对获取的json数据进行解析的方法。分享给大家供大家参考,具体如下:
第一步:根据指定的url从google 服务...
本文实例讲述了android编程实现根据经纬度查询地址并对获取的json数据进行解析的方法。分享给大家供大家参考,具体如下:
第一步:根据指定的url从google 服务器上获得包含地址的json格式的数据(其还提供xml格式的,但json解析效率比xml高)
private static stringbuffer getjsondata(string urlpath){ try { url url = new url(urlpath); httpurlconnection httpurlconnection = (httpurlconnection) url.openconnection(); httpurlconnection.setreadtimeout(5000); httpurlconnection.setrequestmethod("get"); if(httpurlconnection.getresponsecode() == 200){ inputstream inputstream = httpurlconnection.getinputstream(); inputstreamreader isr = new inputstreamreader(inputstream); bufferedreader br = new bufferedreader(isr); string temp = null; stringbuffer jsonsb = new stringbuffer(); while((temp = br.readline()) != null){ jsonsb.append(temp); } return jsonsb; } } catch (malformedurlexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } return null; }
传入经纬度作为参数
/** * 根据经纬度获得地址 * @param latitude * @param longitude * @return */ public static stringbuffer getcurrentaddressbygps(long latitude,long longitude){ stringbuffer stringbuffer = new stringbuffer(); stringbuffer.append(google_gps_prefix).append(latitude).append(",") .append(longitude).append(google_gps_suffix); return getjsondata(stringbuffer.tostring()); }
第三,解析json数据:
public static boolean parseaddressjson(stringbuffer sb){ try { if(sb != null){ jsonobject jsonalldata = new jsonobject(sb.tostring()); /** * 获得一个长度为1的json数组,如:[{数据内容}] */ string placemarkstr = jsonalldata.getstring("placemark"); /** * 将placemarkstr数组类型字符串构造成一个jsonarray对象 */ jsonarray placemarkarray = new jsonarray(placemarkstr); /** * placemark标签内容是一个长度为1的数组,获得数组的内容并转换成字符串 */ string jsondataplacemarkstr = placemarkarray.get(0).tostring(); /** * 对上面得到的json数据类型的字符串(jsondataplacemarkstr)进行解析 */ jsonobject jsondataplacemark = new jsonobject(jsondataplacemarkstr); /** * 获得标签addressdetails的json数据 */ string jsonaddressdetails = jsondataplacemark.getstring("addressdetails"); /** * 对上面得到的json数据类型的字符串(jsonaddressdetails)进行解析 */ jsonobject jsondataaddressjdetails = new jsonobject(jsonaddressdetails); /** * 获得标签country的json数据 */ string jsoncountry = jsondataaddressjdetails.getstring("country"); /** * 对上面得到的json数据类型的字符串(jsoncountry)进行解析 */ jsonobject jsondatacountry = new jsonobject(jsoncountry); /** * 对解析出来的感兴趣的数据进行封装 */ lewatekgpsaddress lewatekgpsaddress = new lewatekgpsaddress(); /** * 设置countryname */ lewatekgpsaddress.setcountryname(jsondatacountry.getstring("countryname")); /** * 设置countrynamecode */ lewatekgpsaddress.setcountrynamecode(jsondatacountry.getstring("countrynamecode")); /** * 获得标签administrativearea的json数据 */ string jsonadministrativearea = jsondatacountry.getstring("administrativearea"); /** * 对上面得到的json数据类型的字符串(jsonadministrativearea)进行解析 */ jsonobject jsondataadministrativearea = new jsonobject(jsonadministrativearea); /** * 设置administrativeareaname */ lewatekgpsaddress.setadministrativeareaname(jsondataadministrativearea.getstring("administrativeareaname")); /** * 获得标签locality的json数据 */ string jsonlocality = jsondataadministrativearea.getstring("locality"); /** * 对上面得到的json数据类型的字符串(jsonlocality)进行解析 */ jsonobject jsondatalocality = new jsonobject(jsonlocality); /** * 设置localityname */ lewatekgpsaddress.setlocalityname(jsondatalocality.getstring("localityname")); /** * 获得标签dependentlocality的json数据 */ string jsondependentlocality = jsondatalocality.getstring("dependentlocality"); /** * 对上面得到的json数据类型的字符串(jsondependentlocality)进行解析 */ jsonobject jsondatadependentlocality = new jsonobject(jsondependentlocality); lewatekgpsaddress.setdependentlocalityname(jsondatadependentlocality.getstring("dependentlocalityname")); log.e(tag,lewatekgpsaddress.tostring()); return true; } } catch (jsonexception e) { // todo auto-generated catch block e.printstacktrace(); } return false; }
从google服务器上获得的json数据(提取对我有用的数据:countryname、localityname、administrativeareaname、dependentlocalityname,即中国上海市上海市浦东新区(中国湖南省衡阳市衡山县这样的数据也能提取)):
{ "name": "31.20322202833381,121.59876351250254", "status": { "code": 200, "request": "geocode" }, "placemark": [ { "id": "p1", "address": "中国上海市浦东新区祖冲之路994号-1088号", "addressdetails": { "accuracy" : 8, "country" : { "administrativearea" : { "administrativeareaname" : "上海市", "locality" : { "dependentlocality" : { "dependentlocalityname" : "浦东新区", "thoroughfare" : { "thoroughfarename" : "祖冲之路994号-1088号" } }, "localityname" : "上海市" } }, "countryname" : "中国", "countrynamecode" : "cn" } }, "extendeddata": { "latlonbox": { "north": 31.2070152, "south": 31.2007199, "east": 121.6018752, "west": 121.5955799 } }, "point": { "coordinates": [ 121.5986103, 31.2038252, 0 ] } } ] } value [{"id":"p1","extendeddata":{"latlonbox":{"south":31.2007199,"west":121.5955799,"east":121.6018752,"north":31.2070152}},"address":"中国上海市浦东新区祖冲之路994号-1088号","point":{"coordinates":[121.5986103,31.2038252,0]},"addressdetails":{"country":{"countrynamecode":"cn","countryname":"中国","administrativearea":{"locality":{"localityname":"上海市","dependentlocality":{"dependentlocalityname":"浦东新区","thoroughfare":{"thoroughfarename":"祖冲之路994号-1088号"}}},"administrativeareaname":"上海市"}},"accuracy":8}}] at placemark of type org.json.jsonarray cannot be converted to jsonobject
ps:这里再为大家推荐几款比较实用的json在线工具供大家参考使用:
在线json代码检验、检验、美化、格式化工具:
json在线格式化工具:
在线xml/json互相转换工具:
json代码在线格式化/美化/压缩/编辑/转换工具:
c语言风格/html/css/json代码格式化美化工具:
更多关于android相关内容感兴趣的读者可查看本站专题:《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android编程之activity操作技巧总结》、《android文件操作技巧汇总》、《android开发入门与进阶教程》、《android资源操作技巧汇总》、《android视图view技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。