JSON解析分为以下几个步骤
1.下载url上的所有的json数据
package mars.com;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpDownloader {
// 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文本当中的内容
// 1.创建一个URL对象
// 2.通过URL对象,创建一个HttpURLConnection对象
// 3.得到InputStream
// 4.从InputStream当中读取数据
private URL url;
public String download(String urlStr) {
StringBuffer sb = new StringBuffer();
String line = null;
BufferedReader buffer = null;
try {
url = new URL(urlStr);
HttpURLConnection urlConn = (HttpURLConnection) url
.openConnection();
buffer = new BufferedReader(new InputStreamReader(
urlConn.getInputStream()));
while ((line = buffer.readLine()) != null) {
sb.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
buffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
2.
package mars.com;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class DemoMapJSONActivity extends Activity {
private Button button;
private TextView show;
private EditText longitude;
private EditText latitude;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.location);
show = (TextView) findViewById(R.id.show);
longitude = (EditText) findViewById(R.id.longitude);
latitude = (EditText) findViewById(R.id.latitude);
button.setOnClickListener(new MyLocationListener());
}
class MyLocationListener implements OnClickListener {
public void onClick(View v) {
HttpDownloader HTT = new HttpDownloader();
String strUrl = "http://maps.googleapis.com/maps/api/geocode/json?latlng="
+ latitude.getText().toString()
+ ","
+ longitude.getText().toString()
+ "&sensor=false&language=zh-CN";
String jsonData = HTT.download(strUrl);
StringBuffer buf = new StringBuffer();
try {
Map<String, Object> result = parseJson(jsonData);
List<Map<String, Object>> all = (List<Map<String, Object>>) result
.get("results");
Iterator<Map<String, Object>> iterator = all.iterator();
int i = 0;
while (iterator.hasNext()) {
Map<String, Object> map = iterator.next();
buf.append("\n地址:" + map.get("formatted_address")
+ "*********" + i++);
break;
}
Map<String, Object> address_components = parseJson(jsonData);
List<Map<String, Object>> all2 = (List<Map<String, Object>>) address_components
.get("address_components");
Iterator<Map<String, Object>> iterator2 = all2.iterator();
int j = 0;
while (iterator2.hasNext()) {
Map<String, Object> map = iterator2.next();
buf.append("\n地址:" + map.get("long_name") + "*********"
+ j++);
}
} catch (Exception e) {
e.printStackTrace();
}
show.setText(buf);
}
}
private Map<String, Object> parseJson(String data) throws Exception {
Map<String, Object> allMap = new HashMap<String, Object>();
JSONObject allData = new JSONObject(data);// 全部的内容变为一个项
JSONArray jsonArray = allData.getJSONArray("results");// 取出数组
List<Map<String, Object>> all = new ArrayList<Map<String, Object>>();
List<Map<String, Object>> all2 = new ArrayList<Map<String, Object>>();
for (int i = 0; i < jsonArray.length(); i++) {
Map<String, Object> map = new HashMap<String, Object>();
JSONObject jsonObject = jsonArray.getJSONObject(i);
map.put("formatted_address",
jsonObject.getString("formatted_address"));
all.add(map);
if (i != 0) {
continue;
}// 只取出第一组完整数据,其他的都没这组详细
JSONArray jsonArray2 = jsonObject
.getJSONArray("address_components");
for (int j = 0; j < jsonArray2.length(); j++) {
Map<String, Object> map2 = new HashMap<String, Object>();
JSONObject jsonObject3 = jsonArray2.getJSONObject(j);
map2.put("long_name", jsonObject3.get("long_name"));
all2.add(map2);
System.out.println("****");
}
}
allMap.put("results", all);// 所有的取出的简直对的list,放到results底下了
allMap.put("address_components", all2);
return allMap;
}
}
3.main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/longitude"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="114.3579530" />
<EditText
android:id="@+id/latitude"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="30.6096780" />
<Button
android:id="@+id/location"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="定位" />
<TextView
android:id="@+id/show"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="显示" />
</LinearLayout>
4.配置权限
<uses-permission android:name="android.permission.INTERNET" />
怕有些人看不懂代码,在此说明以下,我这里只是解析的我需要的最详细地址,其实这个json已经足够复杂了,但是我实际上是经过偷工减料的,我只取了最详细的一组数据
以及最详细的分组数据。所以没有用到工具类。
本来应该用工具类来着,比如说里面的results应该单独是一个类才行,但是我没有用他的其他的属性,所以没有详细的解析。
如果想使用它的其他的属性,比如说address_components,formatted_address ,geometry,types。那你得详细的把这个类的结构写出来,然后以键值对的形式放到List中,然后你想取哪个数据都可以了,就看你了。
json数据如下
{
"results" : [
{
"address_components" : [
{
"long_name" : "1178号",
"short_name" : "1178号",
"types" : [ "street_number" ]
},
{
"long_name" : "和平大道",
"short_name" : "和平大道",
"types" : [ "route" ]
},
{
"long_name" : "武昌区",
"short_name" : "武昌区",
"types" : [ "sublocality", "political" ]
},
{
"long_name" : "武汉",
"short_name" : "武汉",
"types" : [ "locality", "political" ]
},
{
"long_name" : "湖北省",
"short_name" : "湖北省",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "中国",
"short_name" : "CN",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "中国湖北省武汉市武昌区和平大道1178号",
"geometry" : {
"location" : {
"lat" : 30.61071999999999,
"lng" : 114.3566410
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 30.61206898029149,
"lng" : 114.3579899802915
},
"southwest" : {
"lat" : 30.60937101970850,
"lng" : 114.3552920197085
}
}
},
"types" : [ "street_address" ]
},
{
"address_components" : [
{
"long_name" : "武昌区",
"short_name" : "武昌区",
"types" : [ "sublocality", "political" ]
},
{
"long_name" : "武汉",
"short_name" : "武汉",
"types" : [ "locality", "political" ]
},
{
"long_name" : "湖北省",
"short_name" : "湖北省",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "中国",
"short_name" : "CN",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "中国湖北省武汉市武昌区",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 30.62807880,
"lng" : 114.42031060
},
"southwest" : {
"lat" : 30.49578920,
"lng" : 114.26042410
}
},
"location" : {
"lat" : 30.5538990,
"lng" : 114.3158970
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 30.62807880,
"lng" : 114.42031060
},
"southwest" : {
"lat" : 30.49578920,
"lng" : 114.26042410
}
}
},
"types" : [ "sublocality", "political" ]
},
{
"address_components" : [
{
"long_name" : "武汉",
"short_name" : "武汉",
"types" : [ "locality", "political" ]
},
{
"long_name" : "湖北省",
"short_name" : "湖北省",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "中国",
"short_name" : "CN",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "中国湖北省武汉市",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 31.36126030,
"lng" : 115.08257280
},
"southwest" : {
"lat" : 29.96907670,
"lng" : 113.70228110
}
},
"location" : {
"lat" : 30.5930870,
"lng" : 114.3053570
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 30.78745989999999,
"lng" : 114.6189880
},
"southwest" : {
"lat" : 30.34877210,
"lng" : 113.9817810
}
}
},
"types" : [ "locality", "political" ]
},
{
"address_components" : [
{
"long_name" : "湖北省",
"short_name" : "湖北省",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "中国",
"short_name" : "CN",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "中国湖北省",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 33.27561610,
"lng" : 116.13484340
},
"southwest" : {
"lat" : 29.02948840,
"lng" : 108.36696460
}
},
"location" : {
"lat" : 30.5458610,
"lng" : 114.3419210
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 33.27561610,
"lng" : 116.13484340
},
"southwest" : {
"lat" : 29.02948840,
"lng" : 108.36696460
}
}
},
"types" : [ "administrative_area_level_1", "political" ]
},
{
"address_components" : [
{
"long_name" : "中国",
"short_name" : "CN",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "中国",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 53.56097399999999,
"lng" : 134.772810
},
"southwest" : {
"lat" : 18.15352160,
"lng" : 73.49941369999999
}
},
"location" : {
"lat" : 35.861660,
"lng" : 104.1953970
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 53.56097399999999,
"lng" : 134.772810
},
"southwest" : {
"lat" : 18.15352160,
"lng" : 73.49941369999999
}
}
},
"types" : [ "country", "political" ]
}
],
"status" : "OK"
}