当前位置: 首页 > news >正文

Android JSON与对象转换工具类:支持复杂数据结构

在实际开发中,我们经常需要处理复杂的对象,这些对象可能包含基本字段、嵌套对象、List、Map 等数据结构。以下是一个完整的工具类封装,支持复杂对象的序列化(对象转JSON)和反序列化(JSON转对象),并处理常见的数据类型。

复杂对象与JSON转换工具类(基于Gson)

  1. 添加Gson依赖
    在 build.gradle 中添加Gson依赖:
复杂对象与JSON转换工具类(基于Gson)
2. 添加Gson依赖
在 build.gradle 中添加Gson依赖:
  1. 工具类实现
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

public class JsonUtil {
    private static final Gson gson = new GsonBuilder()
            .setPrettyPrinting() // 格式化输出
            .serializeNulls()    // 序列化空值
            .create();

    /**
     * 将对象转换为JSON字符串
     *
     * @param object 需要转换的对象
     * @return JSON字符串
     */
    public static String toJson(Object object) {
        return gson.toJson(object);
    }

    /**
     * 将JSON字符串转换为对象
     *
     * @param json  JSON字符串
     * @param clazz 目标对象的Class类型
     * @param <T>   目标对象的类型
     * @return 转换后的对象
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        return gson.fromJson(json, clazz);
    }

    /**
     * 将JSON字符串转换为List对象
     *
     * @param json  JSON字符串
     * @param clazz List中元素的Class类型
     * @param <T>   List中元素的类型
     * @return 转换后的List对象
     */
    public static <T> List<T> fromJsonToList(String json, Class<T> clazz) {
        Type type = TypeToken.getParameterized(List.class, clazz).getType();
        return gson.fromJson(json, type);
    }

    /**
     * 将JSON字符串转换为Map对象
     *
     * @param json JSON字符串
     * @return 转换后的Map对象
     */
    public static <K, V> Map<K, V> fromJsonToMap(String json) {
        Type type = new TypeToken<Map<K, V>>() {}.getType();
        return gson.fromJson(json, type);
    }

    /**
     * 将对象转换为格式化的JSON字符串(便于阅读)
     *
     * @param object 需要转换的对象
     * @return 格式化后的JSON字符串
     */
    public static String toPrettyJson(Object object) {
        return gson.toJson(object);
    }
}
  1. 复杂对象示例
    3.1 定义数据模型
import java.util.List;
import java.util.Map;

public class User {
    private String name;
    private int age;
    private String email;
    private Address address;          // 嵌套对象
    private List<String> hobbies;    // List字段
    private Map<String, String> metadata; // Map字段

    // 必须有无参构造函数
    public User() {}

    public User(String name, int age, String email, Address address, List<String> hobbies, Map<String, String> metadata) {
        this.name = name;
        this.age = age;
        this.email = email;
        this.address = address;
        this.hobbies = hobbies;
        this.metadata = metadata;
    }

    // Getter和Setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public List<String> getHobbies() {
        return hobbies;
    }

    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }

    public Map<String, String> getMetadata() {
        return metadata;
    }

    public void setMetadata(Map<String, String> metadata) {
        this.metadata = metadata;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", address=" + address +
                ", hobbies=" + hobbies +
                ", metadata=" + metadata +
                '}';
    }
}

class Address {
    private String city;
    private String zipCode;

    // 必须有无参构造函数
    public Address() {}

    public Address(String city, String zipCode) {
        this.city = city;
        this.zipCode = zipCode;
    }

    // Getter和Setter方法
    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    @Override
    public String toString() {
        return "Address{" +
                "city='" + city + '\'' +
                ", zipCode='" + zipCode + '\'' +
                '}';
    }
}

3.2 对象转JSON

Address address = new Address("New York", "10001");
List<String> hobbies = Arrays.asList("Reading", "Traveling");
Map<String, String> metadata = new HashMap<>();
metadata.put("role", "admin");
metadata.put("department", "IT");

User user = new User("John", 25, "john@example.com", address, hobbies, metadata);
String json = JsonUtil.toJson(user);
System.out.println(json);

// 输出:
// {
//   "name": "John",
//   "age": 25,
//   "email": "john@example.com",
//   "address": {
//     "city": "New York",
//     "zipCode": "10001"
//   },
//   "hobbies": ["Reading", "Traveling"],
//   "metadata": {
//     "role": "admin",
//     "department": "IT"
//   }
// }

3.3 JSON转对象

String json = "{\"name\":\"John\",\"age\":25,\"email\":\"john@example.com\"," +
              "\"address\":{\"city\":\"New York\",\"zipCode\":\"10001\"}," +
              "\"hobbies\":[\"Reading\",\"Traveling\"]," +
              "\"metadata\":{\"role\":\"admin\",\"department\":\"IT\"}}";
User user = JsonUtil.fromJson(json, User.class);
System.out.println(user);

// 输出:
// User{name='John', age=25, email='john@example.com', address=Address{city='New York', zipCode='10001'}, hobbies=[Reading, Traveling], metadata={role=admin, department=IT}}

3.4 JSON转List

String json = "[{\"name\":\"John\",\"age\":25,\"email\":\"john@example.com\"}," +
              "{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"}]";
List<User> userList = JsonUtil.fromJsonToList(json, User.class);
System.out.println(userList);

// 输出:
// [User{name='John', age=25, email='john@example.com'}, User{name='Alice', age=30, email='alice@example.com'}]

3.5 JSON转Map

String json = "{\"role\":\"admin\",\"department\":\"IT\"}";
Map<String, String> metadata = JsonUtil.fromJsonToMap(json);
System.out.println(metadata);

// 输出:
// {role=admin, department=IT}
  1. 扩展功能
    4.1 自定义序列化与反序列化
    如果需要处理复杂的数据类型(如日期、枚举等),可以通过 GsonBuilder 注册自定义的序列化器和反序列化器。
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new DateSerializer()) // 自定义日期序列化
        .registerTypeAdapter(Date.class, new DateDeserializer()) // 自定义日期反序列化
        .create();

4.2 排除字段
使用 @Expose 注解控制字段的序列化和反序列化。

public class User {
    @Expose
    private String name;

    @Expose(serialize = false) // 仅反序列化,不序列化
    private int age;

    private String email; // 不参与序列化和反序列化
}

4.3 处理空值
通过 GsonBuilder 配置是否序列化空值。

Gson gson = new GsonBuilder()
        .serializeNulls() // 序列化空值
        .create();
  1. 总结
    通过封装基于Gson的工具类,可以轻松处理复杂对象的序列化和反序列化,包括:

基本字段。

嵌套对象。

List 和 Map 等集合类型。

该工具类适用于大多数Android开发场景,特别是与后端API交互时的数据解析和封装。如果需要更复杂的功能(如自定义序列化、排除字段等),可以通过 GsonBuilder 进一步扩展。

相关文章:

  • 如何在unity中完整录制一段动画
  • C# 多线程编程完全指南:从基础到高级应用
  • 物联网实时数据存储方案选择
  • 山东大学计算机科学与技术学院软件工程实验日志(更新中)
  • 【蓝桥杯集训·每日一题2025】 AcWing 5538. 回文游戏 python
  • 文本Embedding
  • 如何利用数字校园平台提升职业竞争力
  • 【MATLAB例程】三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波,订阅专栏后可查看完整代码
  • 【C++算法】AVL树的平衡之美:从理论到C++高效实现
  • uniapp实现的个人中心页面(仿小红书)
  • C 语 言 --- 数 组 (2)
  • ubuntu直接安装mobaxterm
  • 分布式网络
  • 如何下载和使用Git:初学者指南
  • WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)
  • DeepSeek:从入门到精通 —— 探索国产顶尖代码大模型的无限可能
  • 【docker远程响应】
  • C++ 中的静态数组 std::array
  • 安卓设备root检测与隐藏手段
  • mysql进阶(四)
  • wordpress 更新主题/优化大师的三大功能
  • 设计师常备设计网站大全/在哪里找软件开发公司
  • 网站域名变了怎么查/全媒体广告代理加盟
  • 海外网购/seo属于技术还是营销
  • txt怎么做网站/3d建模培训学校哪家好
  • 网站建设框架搭建/seo营销技巧