别想一下造出大海,必须先由小河川开始。
本讲内容:解析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

被折叠的 条评论
为什么被折叠?



