比起XML格式数据,解析JSON格式数据会更省流量。
解析的方式也有很多种方法,可以使用官方提供的JSONObject,也可以使用谷歌的开源库GSON。
一、JSONObject
实例:
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
TextView tvShowHttpResponse;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvShowHttpResponse = (TextView)findViewById(R.id.tvShowHttpResponse);
Button btnSendHttpRequest = (Button)findViewById(R.id.btnSendHttpRequest);
btnSendHttpRequest.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId() == R.id.btnSendHttpRequest){
sendHttpRequset();
}
}
private void sendHttpRequset() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient.Builder()
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(100, TimeUnit.SECONDS)
.build();
// OkHttpClient client = new OkHttpClient();
Request requset = new Request.Builder()
// 指定服务器的地址 - 10.0.2.2对于模拟器来说就是电脑本机的IP地址
.url("http://10.0.2.2/get_data.json")
.build();
Response response = client.newCall(requset).execute();
String responseData = response.body().string();
parseJSONWithJSONObject(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void parseJSONWithJSONObject(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 version = jsonObject.getString("version");
String name = jsonObject.getString("name");
Log.d(TAG, "id is:" + id);
Log.d(TAG, "version is:" + version);
Log.d(TAG, "name is:" + name);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
定义一个JSONArray数组,并将服务器返回的数据传入;然后遍历这个数组,从中取出的每一个元素都是一个JSONObject对象,在每个JSONObject对象中又会包含字段,通过get方法就可以把数据取出。
二、GSON
既然是开源库,就需要在app/build.gradle文件中导入
compile ‘com.google.code.gson:gson:2.7’
GSON库主要是将一段JSON格式的字符串自动映射成一个对象,从而不需要我们在手动编写代码进行解析。
比如一段JSON格式的数据如下:
{“name”:”ads”, “age”:”12”}
我们就可以定义一个类,加入name和age字段,通过以下代码就可以将JSON数据自动解析成一个Person对象了。
Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);
如果解析的是JSONS数组,可以使用以下方式:
List<Person> person = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
实例:
JSONData.java
public class JSONData {
String id;
String version;
String name;
public String getName() {
return name;
}
public String getId() {
return id;
}
public String getVersion() {
return version;
}
public void setName(String name) {
this.name = name;
}
public void setId(String id) {
this.id = id;
}
public void setVersion(String version) {
this.version = version;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
TextView tvShowHttpResponse;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvShowHttpResponse = (TextView)findViewById(R.id.tvShowHttpResponse);
Button btnSendHttpRequest = (Button)findViewById(R.id.btnSendHttpRequest);
btnSendHttpRequest.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId() == R.id.btnSendHttpRequest){
sendHttpRequset();
}
}
private void sendHttpRequset() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient.Builder()
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(100, TimeUnit.SECONDS)
.build();
// OkHttpClient client = new OkHttpClient();
Request requset = new Request.Builder()
// 指定服务器的地址 - 10.0.2.2对于模拟器来说就是电脑本机的IP地址
.url("http://10.0.2.2/get_data.json")
.build();
Response response = client.newCall(requset).execute();
String responseData = response.body().string();
parseJSONWithGSON(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void parseJSONWithGSON(String jsonData) {
Gson gson = new Gson();
List<JSONData> jsonDataList = gson.fromJson(jsonData, new TypeToken<List<JSONData>>(){}.getType());
for(JSONData data : jsonDataList){
Log.d(TAG, "id is:"+data.getId());
Log.d(TAG, "id is:"+data.getName());
Log.d(TAG, "id is:"+data.getVersion());
}
}
}