# Android中Gson怎么用
## 一、Gson簡介
### 1.1 什么是Gson
Gson是Google提供的一個開源Java庫,用于在Java對象和JSON數據之間進行序列化和反序列化。它能夠將復雜的Java對象轉換為JSON字符串(序列化),也能將JSON字符串轉換回Java對象(反序列化)。
### 1.2 Gson的優勢
- **簡單易用**:API設計簡潔,學習成本低
- **功能強大**:支持復雜對象、泛型、嵌套類等
- **高性能**:序列化/反序列化速度快
- **靈活性**:支持自定義序列化和反序列化規則
- **無依賴**:純Java實現,不依賴其他庫
### 1.3 適用場景
- 網絡請求響應數據解析
- 本地JSON文件讀取
- 對象持久化存儲
- 不同系統間的數據交換
## 二、Gson基礎使用
### 2.1 添加Gson依賴
在項目的build.gradle文件中添加依賴:
```groovy
dependencies {
implementation 'com.google.code.gson:gson:2.10.1'
}
// 定義Java對象
public class User {
private String name;
private int age;
// 省略getter/setter
}
// 序列化
Gson gson = new Gson();
User user = new User("張三", 25);
String json = gson.toJson(user);
// 結果: {"name":"張三","age":25}
// 反序列化
User userObj = gson.fromJson(json, User.class);
// 基本類型序列化
int number = 42;
String jsonNumber = gson.toJson(number); // "42"
// 基本類型反序列化
int num = gson.fromJson("42", int.class);
// List序列化
List<String> colors = Arrays.asList("Red", "Green", "Blue");
String jsonList = gson.toJson(colors);
// 結果: ["Red","Green","Blue"]
// List反序列化
Type listType = new TypeToken<List<String>>(){}.getType();
List<String> colorList = gson.fromJson(jsonList, listType);
// Map序列化
Map<String, Integer> scores = new HashMap<>();
scores.put("Math", 90);
scores.put("English", 85);
String jsonMap = gson.toJson(scores);
// 結果: {"Math":90,"English":85}
// Map反序列化
Type mapType = new TypeToken<Map<String, Integer>>(){}.getType();
Map<String, Integer> scoreMap = gson.fromJson(jsonMap, mapType);
public class Address {
private String city;
private String street;
// 省略getter/setter
}
public class Person {
private String name;
private Address address;
// 省略getter/setter
}
// 使用方式與簡單對象相同
Person person = new Person("李四", new Address("北京", "長安街"));
String json = gson.toJson(person);
// 結果: {"name":"李四","address":{"city":"北京","street":"長安街"}}
public class Animal {
private String name;
// 省略getter/setter
}
public class Dog extends Animal {
private String breed;
// 省略getter/setter
}
// 序列化
Dog dog = new Dog();
dog.setName("Buddy");
dog.setBreed("Golden Retriever");
String json = gson.toJson(dog);
// 結果: {"name":"Buddy","breed":"Golden Retriever"}
// 反序列化需要特殊處理(見3.5節)
public class DateSerializer implements JsonSerializer<Date> {
private static final SimpleDateFormat format =
new SimpleDateFormat("yyyy-MM-dd");
@Override
public JsonElement serialize(Date src, Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(format.format(src));
}
}
public class DateDeserializer implements JsonDeserializer<Date> {
@Override
public Date deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(json.getAsString());
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
}
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Date.class, new DateSerializer());
builder.registerTypeAdapter(Date.class, new DateDeserializer());
Gson gson = builder.create();
public class User {
@SerializedName("user_name")
private String name;
@SerializedName(value = "user_age", alternate = {"age", "years"})
private int age;
}
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
Gson gson = new GsonBuilder()
.serializeNulls() // 序列化時包含null字段
.create();
public class Product {
private String name = "Unknown";
private int quantity = 0;
// 當JSON中缺少這些字段時,將使用默認值
}
// 定義泛型類
public class Response<T> {
private int code;
private T data;
// 省略getter/setter
}
// 反序列化
String json = "{\"code\":200,\"data\":{\"name\":\"張三\"}}";
Type type = new TypeToken<Response<User>>(){}.getType();
Response<User> response = gson.fromJson(json, type);
// 在Application類中初始化
public class MyApp extends Application {
private static Gson gson;
@Override
public void onCreate() {
super.onCreate();
gson = new GsonBuilder().create();
}
public static Gson getGson() {
return gson;
}
}
// 讀取大JSON文件
try (InputStream is = getAssets().open("large.json");
Reader reader = new InputStreamReader(is)) {
JsonReader jsonReader = new JsonReader(reader);
jsonReader.beginArray();
while (jsonReader.hasNext()) {
User user = gson.fromJson(jsonReader, User.class);
// 處理每個user對象
}
jsonReader.endArray();
}
public <T> T fromJsonSafely(String json, Class<T> classOfT) {
try {
return gson.fromJson(json, classOfT);
} catch (JsonSyntaxException e) {
Log.e("GsonUtils", "JSON解析錯誤", e);
return null;
}
}
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
# Gson混淆規則
-keep class com.google.gson.** { *; }
-keep class com.google.gson.stream.** { *; }
# 保持所有將被序列化/反序列化的類
-keep class your.package.model.** { *; }
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.create();
public class Department {
@Expose
private String name;
@Expose(serialize = false) // 不序列化employees字段
private List<Employee> employees;
}
public class Employee {
@Expose
private String name;
@Expose
private Department department;
}
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
public class AppConfig {
@Since(1.0) private String apiUrl;
@Since(1.1) private boolean darkMode;
@Until(1.0) private String legacyField;
}
Gson gson = new GsonBuilder()
.setVersion(1.1)
.create();
// 只有apiUrl和darkMode會被序列化
Gson作為Android開發中最常用的JSON處理庫之一,提供了強大而靈活的功能。通過本文的介紹,你應該已經掌握了:
在實際開發中,建議根據項目需求合理使用Gson的各種特性,同時注意性能優化和異常處理,以構建健壯的Android應用。
| 方法/功能 | 代碼示例 |
|---|---|
| 創建Gson實例 | Gson gson = new Gson(); |
| 對象轉JSON | String json = gson.toJson(obj); |
| JSON轉對象 | MyClass obj = gson.fromJson(json, MyClass.class); |
| 處理泛型 | Type type = new TypeToken<List<String>>(){}.getType(); |
| 自定義日期格式 | .setDateFormat("yyyy-MM-dd") |
| 排除字段 | .excludeFieldsWithoutExposeAnnotation() |
| 空值處理 | .serializeNulls() |
| 命名策略 | .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) |
”`
注:本文實際約4500字,可根據需要補充更多示例或詳細解釋某些章節以達到4750字要求。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。