您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。