Android-Gson解析JSON資料(JSON物件/JSON陣列)
上一篇部落格,Android-解析JSON資料(JSON物件/JSON陣列),介紹了使用 org.json.JSONArray;/org.json.JSONObject; 來解析JSON資料;
Google Android 還提供來另外一種方式來解析JSON資料,那就是Gson;
Gson是非常方便的JSON解析/封裝/處理等等,強大的工具類:
特點:Gson可以把JSON物件資料->轉換對映為Bean物件
Gson可以把JSON陣列資料->轉換對映為集合
Gson可以把Bean物件->轉換為JSON物件資料
Gson可以把集合->轉換為JSON陣列資料
...........
首先要在app/build.gradle配置檔案中,匯入,Gson支援包
// Gson支援包的匯入
implementation 'com.google.code.gson:gson:2.6.2'
需要解析的JSON資料:
/data/data/liudeli.mynetwork01/files/pottingJSON1
{ "name":"李四", "age":99, "hobby":"愛好是練習截拳道" }
/data/data/liudeli.mynetwork01/files/pottingJSONArray1
[
{
"name":"君君",
"age":89,
"sex":"男"
},
{
"name":"小君",
"age":99,
"sex":"女"
},
{
"name":"大君",
"age":88,
"sex":"男"
}
]
定義一個Bean
定義的name/age/hobby 必須要和JSON資料裡面的一模一樣
package liudeli.mynetwork01.entity; /** * 定義一個Bean * 定義的name/age/hobby 必須要和JSON資料裡面的一模一樣 * { * "name":"李四", * "age":99, * "hobby":"愛好是練習截拳道" * } */ public class Student2 { private String name; private int age; private String hobby; public Student2(String name, int age, String hobby) { this.name = name; this.age = age; this.hobby = hobby; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", hobby='" + hobby + '\'' + '}'; } }
定義的name/age/sex 必須要和JSON資料裡面的一模一樣
package liudeli.mynetwork01.entity; /** * 定義一個Bean * 定義的name/age/sex 必須要和JSON資料裡面的一模一樣 * * [ * { * "name":"君君", * "age":89, * "sex":"男" * }, * { * "name":"小君", * "age":99, * "sex":"女" * }, * { * "name":"大君", * "age":88, * "sex":"男" * } * ] */ public class Student { private String name; private int age; private String sex; public Student(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; } }
GsonAnalyzeJSONActivity.java
package liudeli.mynetwork01; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.List; import liudeli.mynetwork01.entity.Student; import liudeli.mynetwork01.entity.Student2; public class GsonAnalyzeJSONActivity extends Activity { private final String TAG = GsonAnalyzeJSONActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gson_analyze); } /** * Gson解析JSON物件 * { * "name":"李四", * "age":99, * "hobby":"愛好是練習截拳道" * } */ public void gonsAnalyzeJSONObject(View view) { String jsonData = readFile("pottingJSON1"); // Log.d(TAG, "jsonData:" + jsonData); Gson gson = new Gson(); Student2 student2 = gson.fromJson(jsonData, Student2.class); Log.d(TAG, "gonsAnalyzeJSONObject 解析後的結果:" + student2.toString()); } /** * Gson解析JSON陣列 * [ * { * "name":"君君", * "age":89, * "sex":"男" * }, * { * "name":"小君", * "age":99, * "sex":"女" * }, * { * "name":"大君", * "age":88, * "sex":"男" * } * ] * @param view */ public void gonsAnalyzeJSONArray(View view) { String jsonData = readFile("pottingJSONArray1"); // Log.d(TAG, "jsonData:" + jsonData); Gson gson = new Gson(); /** * TypeToken<List<需要對映的Bean物件>>(){}.getType() */ List<Student> list = gson.fromJson(jsonData, new TypeToken<List<Student>>(){}.getType()); // 引數二:需要指定型別,型別來決定解析的集合 for (Student student: list) { Log.d(TAG, "gonsAnalyzeJSONArray 解析後的結果:" + student.toString()); } } /** * 讀取檔案裡面的字串 * @param fileName * @return */ private String readFile(String fileName) { String result = null; try { InputStream inputStream = openFileInput(fileName); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] bytes = new byte[inputStream.available()]; inputStream.read(bytes); baos.write(bytes, 0,bytes.length); result = new String(baos.toByteArray()); baos.close(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } return result; } }
activity_gson_analyze.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Gson解析JSON物件" android:onClick="gonsAnalyzeJSONObject" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Gson解析JSON陣列" android:onClick="gonsAnalyzeJSONArray" /> </LinearLayout>
日誌的列印:
使用Gson解析,JSON物件資料:
12-23 23:00:52.108 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONObject 解析後的結果:Student{name='李四', age=99, hobby='愛好是練習截拳道'}
使用Gson解析,JSON陣列資料:
12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析後的結果:Student{name='君君', age=89, sex='男'}
12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析後的結果:Student{name='小君', age=99, sex='女'}
12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析後的結果:Student{name='大君', age=88, sex='男'}