前言
1.解析JSON數據可以使用官方提供的JSONObject,也可以使用谷歌的開源庫GSON。
2.以下兩個實例均用到了Android網絡技術中的OkHttp,OkHttp具體使用可參考鏈接: Android網絡技術之HttpURLConnection及OkHttp簡單實例.
3.在解析數據之前還要搭建Web服務器,在服務器上創建JSON數據源,用來被解析:
工程結構:
數據源:
瀏覽器訪問地址:http://localhost:8080/AndroidServer/testData.json
成功顯示數據即爲搭建服務器成功:
4.一定要保證Android studio自帶的模擬器或者其它模擬器能夠訪問Web服務器,具體可參考: Android studio使用雷電模擬器以及Android studio自帶的模擬器來訪問本機搭建的Web服務器.
一、使用JSONObject解析數據
1.創建UI佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main2Activity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="點擊解析數據(JSONObject)"
android:id="@+id/Send_request" />
</RelativeLayout>
2.在Activity裏編寫實現代碼
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import org.json.JSONArray;
import org.json.JSONObject;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class Main2Activity extends AppCompatActivity implements View.OnClickListener{
private Button sendRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
sendRequest = findViewById(R.id.Send_request);
sendRequest.setOnClickListener(this);
}
/**
* 點擊按鈕調用下面的網絡請求方法
* @param v
*/
@Override
public void onClick(View v) {
if (v.getId()==R.id.Send_request){
sendRequestWithOkHttp();
}
}
/**
* 網絡請求方法
*/
private void sendRequestWithOkHttp(){
//Android不允許在主線程中進行網絡訪問,所以要另起線程來發起網絡請求
new Thread(new Runnable() {
@Override
public void run() {
try{
/**
* 1.創建一個OkHttpClient實例。
*/
OkHttpClient client = new OkHttpClient();
/**
* 2.要發起HTTP請求,所以要創建一個Request對象,
* 通過url()方法設置目標網絡地址,
* 注意:使用Android studio自帶的模擬器訪問Web服務器時目標IP爲10.0.2.2:8080,
*但我這裏的測試環境用的是雷電模擬器,所以目標IP要換爲電腦IP地址(Web服務器在這個電腦上)
*/
//Request request = new Request.Builder().url("http://10.0.2.2:8080/AndroidServer/testData.json").build();
Request request = new Request.Builder().url("http://電腦IP地址:8080/AndroidServer/testData.json").build();
/**
* 3.調用OkHttpClient的newCall()方法來創建一個Call對象,
* 並調用它的execute()方法來發送請求並獲取服務器返回的數據,
* 其中Response對象就是服務器返回的數據。
*/
Response response = client.newCall(request).execute();
/**
*4.使用如下寫法來得到返回的具體內容。
*/
String responseData = response.body().string();
parseJSONWithJSONObject(responseData);
}catch (Exception e){
e.printStackTrace();
}finally {
}
}
}).start();
}
/**
* JSONObject方式解析返回的JSON數據
*
* @param jsonData
*/
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 name = jsonObject.getString("name");
String age = jsonObject.getString("age");
String gender = jsonObject.getString("gender");
//控制檯輸出
Log.i("Main2Activity","======>>name:"+name);
Log.i("Main2Activity","======>>age:"+age);
Log.i("Main2Activity","======>>gender:"+gender);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
結果(點擊模擬器中的按鈕後Android studio控制檯打印輸出):
二、使用GSON解析數據
1.添加GSON庫的依賴
implementation 'com.google.code.gson:gson:2.8.5'
2.創建實體類App
GSON庫主要是將一段JSON格式的字符自動映射成一個對象,從而不需要我們再動手去編寫代碼進行解析了。因此我們還需要編寫對應的JSON對象實體類:
public class App {
private String name;
private String age;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
3.創建UI佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main2Activity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="點擊解析數據(GSON)"
android:id="@+id/Send_request" />
</RelativeLayout>
4.在Activity裏編寫實現代碼
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button sendRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendRequest = findViewById(R.id.Send_request);
sendRequest.setOnClickListener(this);
}
/**
* 點擊按鈕調用下面的網絡請求方法
* @param v
*/
@Override
public void onClick(View v) {
if (v.getId()==R.id.Send_request){
sendRequestWithOkHttp();
}
}
/**
* 網絡請求方法
*/
private void sendRequestWithOkHttp(){
//Android不允許在主線程中進行網絡訪問,所以要另起線程來發起網絡請求
new Thread(new Runnable() {
@Override
public void run() {
try{
/**
* 1.創建一個OkHttpClient實例。
*/
OkHttpClient client = new OkHttpClient();
/**
* 2.要發起HTTP請求,所以要創建一個Request對象,
* 通過url()方法設置目標網絡地址,
* 注意:使用Android studio自帶的模擬器訪問Web服務器時目標IP爲10.0.2.2:8080,
*但我這裏的測試環境用的是雷電模擬器,所以目標IP要換爲電腦IP地址(Web服務器在這個電腦上)
*/
//Request request = new Request.Builder().url("http://10.0.2.2:8080/AndroidServer/testData.json").build();
Request request = new Request.Builder().url("http://電腦IP地址:8080/AndroidServer/testData.json").build();
/**
* 3.調用OkHttpClient的newCall()方法來創建一個Call對象,
* 並調用它的execute()方法來發送請求並獲取服務器返回的數據,
* 其中Response對象就是服務器返回的數據。
*/
Response response = client.newCall(request).execute();
/**
*4.使用如下寫法來得到返回的具體內容。
*/
String responseData = response.body().string();
praseJSONWithGSON(responseData);
}catch (Exception e){
e.printStackTrace();
}finally {
}
}
}).start();
}
/**
* GSON方式解析返回的JSON數據
*
* @param jsonData
*/
private void praseJSONWithGSON(String jsonData){
Gson gson = new Gson();
/**
* 如果只是簡單的JSON對象,那麼我們只需要簡單的調用如下代碼即可:
* App app = gson.fromJson(jsonData,App.class);
* 如果是一段JSON數組,我們需要藉助TypeToken將期望解析成的數據類型傳入到fromJson()方法中,
* 這裏即採用的這種方式。
*/
List<App> appList = gson.fromJson(jsonData,new TypeToken<List<App>>(){}.getType());
for (App app:appList){
Log.i("Main2Activity","======>>name:"+app.getName());
Log.i("Main2Activity","======>>age:"+app.getAge());
Log.i("Main2Activity","======>>gender:"+app.getGender());
}
}
}
結果(點擊模擬器中的按鈕後Android studio控制檯打印輸出):
至此,以上JSONObject以及GSON兩個應用實例完成。