标签:
别想一下造出大海,必须先由小河川开始。
本讲内容:解析JSON格式数据
1)比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如XML直观。
2)解析JSON格式的数据有多种方式,常用的两种是:使用官方提供的JSONObject和谷歌的开源库GSON。
示例一:解析服务器返回的数据
一、JSONObject解析方式
步骤:
1、在服务器中定义一个JSONArray,并将服务器返回的数据传入到JSONArray对象中
2、循环遍历这个JSONArray,从中取出和每一个元素都是一个JSONObject对象,每个JSONObject对象中又会包含id、name、和version这些数据
3、调用getString()方法将这些数据取出。
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity implements OnClickListener { private Button sendRequest; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sendRequest = (Button) findViewById(R.id.id_send); sendRequest.setOnClickListener(this); } public void onClick(View v) { if (v.getId() == R.id.id_send) { sendRequestWithHttpClient(); } } /** * 使用HttpClient发送HTTP请求 */ private void sendRequestWithHttpClient() { // 开启线程来发起网络请求 new Thread(new Runnable() { public void run() { try { HttpClient httpClient = new DefaultHttpClient();// 创建一个DefaultHttpClient实例 // 指定访问的服务器地址是电脑本机,10.0.2.2对于模拟器来说就是电脑本机的IP地址 HttpGet httpGet = new HttpGet("http://10.0.2.2/get_data.json"); HttpResponse httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == 200) { // 请求和响应都成功了 HttpEntity entity = httpResponse.getEntity();// 获取一个HttpEntity实例,取出服务器返回的具体内容 String response = EntityUtils.toString(entity, "utf-8");// 不写utf-8会出现乱码 parseJSONWithSAX(response);//通过JSONObject解析服务器返回的数据 } } catch (Exception e) { e.printStackTrace(); } } }).start(); ; } /** * 通过JSONObject解析 */ private void parseJSONWithSAX(String jsonData) { try { JSONArray jsonArray=new JSONArray(jsonData); for(int i=0;i<jsonArray.length();i++){ JSONObject jsonObject=jsonArray.getJSONObject(i); String id=jsonObject.getString("id"); String name=jsonObject.getString("name"); String version=jsonObject.getString("version"); Log.d("MainActivity", "id is "+id); Log.d("MainActivity", "name is "+name); Log.d("MainActivity", "version is "+version); } } catch (Exception e) { e.printStackTrace(); } } }
运行程序并点击按钮
二、GSON解析方式
由于GSON并没有添加到Android官方的API中,因此如果想要使用这个功能必须要在项目中添加一个GSON的Jar包。
步骤:
1、定义一个类(编写字段)
2、借助TypeToken将期望解析成的数据类型传入到fromJson()方法中
List<App> appList=gson.fromJson(jsonData, new TypeToken<List<App>>() {}.getType());
下面是App.java文件:
public class App { private String id; private String name; private String version; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } }
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity implements OnClickListener { private Button sendRequest; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sendRequest = (Button) findViewById(R.id.id_send); sendRequest.setOnClickListener(this); } public void onClick(View v) { if (v.getId() == R.id.id_send) { sendRequestWithHttpClient(); } } /** * 使用HttpClient发送HTTP请求 */ private void sendRequestWithHttpClient() { // 开启线程来发起网络请求 new Thread(new Runnable() { public void run() { try { HttpClient httpClient = new DefaultHttpClient();// 创建一个DefaultHttpClient实例 // 指定访问的服务器地址是电脑本机,10.0.2.2对于模拟器来说就是电脑本机的IP地址 HttpGet httpGet = new HttpGet("http://10.0.2.2/get_data.json"); HttpResponse httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == 200) { // 请求和响应都成功了 HttpEntity entity = httpResponse.getEntity();// 获取一个HttpEntity实例,取出服务器返回的具体内容 String response = EntityUtils.toString(entity, "utf-8");// 不写utf-8会出现乱码 parseJSONWithGSON(response);//通过GSON解析服务器返回的数据 } } catch (Exception e) { e.printStackTrace(); } } }).start(); ; } /** * 通过JSONObject解析 */ private void parseJSONWithGSON(String jsonData) { try { Gson gson=new Gson(); List<App> appList=gson.fromJson(jsonData, new TypeToken<List<App>>() {}.getType()); for (App app : appList) { Log.d("MainActivity", "id is "+app.getId()); Log.d("MainActivity", "name is "+app.getName()); Log.d("MainActivity", "version is "+app.getVersion()); } } catch (Exception e) { e.printStackTrace(); } } }
运行程序并点击按钮
Take your time and enjoy it
标签:
原文地址:http://blog.csdn.net/liguojin1230/article/details/46550263