Gson bean getxxx,怎么才能返回给前端

使用Gson将Java对象转换为JSON返回给前端,有以下几种常见方式:

1. 基本POJO序列化(推荐)

定义Java Bean

复制代码
public class User {
    private Long id;
    private String name;
    private Integer age;
    private Date createTime;
    
    // Getter/Setter 方法
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public Integer getAge() {
        return age;
    }
    
    public void setAge(Integer age) {
        this.age = age;
    }
    
    public Date getCreateTime() {
        return createTime;
    }
    
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

转换为JSON返回

复制代码
@RestController
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/user")
    public String getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("张三");
        user.setAge(25);
        user.setCreateTime(new Date());
        
        Gson gson = new Gson();
        return gson.toJson(user);
    }
    
    // 或者使用@ResponseBody自动转换
    @GetMapping("/user2")
    @ResponseBody
    public User getUser2() {
        User user = new User();
        user.setId(1L);
        user.setName("李四");
        user.setAge(30);
        return user;
    }
}

2. 使用@SerializedName自定义字段名

复制代码
public class Product {
    @SerializedName("product_id")
    private Long id;
    
    @SerializedName("product_name")
    private String name;
    
    @SerializedName("current_price")
    private Double price;
    
    // Getter/Setter
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public Double getPrice() {
        return price;
    }
    
    public void setPrice(Double price) {
        this.price = price;
    }
}

3. 配置Gson实例(日期格式化、空值处理等)

复制代码
@Configuration
public class GsonConfig {
    
    @Bean
    public Gson gson() {
        return new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss")  // 日期格式化
            .serializeNulls()                     // 序列化null值
            .setPrettyPrinting()                  // 美化输出
            .create();
    }
    
    // 或者使用 excludeFieldsWithoutExposeAnnotation
    @Bean
    public Gson gsonWithExpose() {
        return new GsonBuilder()
            .excludeFieldsWithoutExposeAnnotation()  // 只序列化有@Expose注解的字段
            .create();
    }
}

4. 统一返回结果封装

复制代码
// 统一返回结果类
public class Result<T> {
    private Integer code;
    private String message;
    private T data;
    
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMessage("success");
        result.setData(data);
        return result;
    }
    
    public static <T> Result<T> error(String message) {
        Result<T> result = new Result<>();
        result.setCode(500);
        result.setMessage(message);
        return result;
    }
    
    // Getter/Setter
    public Integer getCode() {
        return code;
    }
    
    public void setCode(Integer code) {
        this.code = code;
    }
    
    public String getMessage() {
        return message;
    }
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    public T getData() {
        return data;
    }
    
    public void setData(T data) {
        this.data = data;
    }
}

// 控制器中使用
@RestController
@RequestMapping("/api")
public class ApiController {
    
    @Autowired
    private Gson gson;
    
    @GetMapping("/data")
    public String getData() {
        List<User> userList = new ArrayList<>();
        // ... 添加数据
        
        Result<List<User>> result = Result.success(userList);
        return gson.toJson(result);
    }
}

5. 使用@Expose注解控制序列化

复制代码
public class Order {
    @Expose
    private Long id;
    
    @Expose
    private String orderNo;
    
    @Expose(serialize = false)  // 序列化时排除
    private String internalCode;
    
    private String remark;  // 没有@Expose注解,默认不序列化
    
    // Getter/Setter
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public String getOrderNo() {
        return orderNo;
    }
    
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    
    public String getInternalCode() {
        return internalCode;
    }
    
    public void setInternalCode(String internalCode) {
        this.internalCode = internalCode;
    }
    
    public String getRemark() {
        return remark;
    }
    
    public void setRemark(String remark) {
        this.remark = remark;
    }
}

6. Spring Boot中全局配置

复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        GsonHttpMessageConverter gsonConverter = new GsonHttpMessageConverter();
        gsonConverter.setGson(new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss")
            .create());
        converters.add(gsonConverter);
    }
}

7. 处理特殊需求

排除某些字段

复制代码
public class User {
    private Long id;
    private String name;
    
    @Expose(serialize = false)
    private String password;  // 不序列化密码
    
    // 使用 transient 关键字
    private transient String secretKey;  // 不参与序列化
    
    // Getter/Setter
}

自定义序列化器

复制代码
public class UserSerializer implements JsonSerializer<User> {
    @Override
    public JsonElement serialize(User user, Type type, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("id", user.getId());
        jsonObject.addProperty("name", user.getName());
        jsonObject.addProperty("age", user.getAge());
        // 自定义逻辑
        jsonObject.addProperty("description", user.getName() + ",年龄:" + user.getAge());
        return jsonObject;
    }
}

// 注册使用
Gson gson = new GsonBuilder()
    .registerTypeAdapter(User.class, new UserSerializer())
    .create();

8. 前端接收示例

复制代码
// 假设返回的JSON是:
// {
//   "code": 200,
//   "message": "success",
//   "data": {
//     "id": 1,
//     "name": "张三",
//     "age": 25,
//     "createTime": "2024-01-20 10:30:00"
//   }
// }

fetch('/api/user')
  .then(response => response.json())
  .then(data => {
    console.log(data.code);    // 200
    console.log(data.message); // "success"
    console.log(data.data.name); // "张三"
  });

最佳实践建议:

  1. 统一返回格式:使用统一的Result类封装返回结果

  2. 配置全局Gson:在Spring Boot中配置全局Gson实例

  3. 安全性考虑:敏感字段(密码、token等)不要序列化

  4. 性能优化:重用Gson实例,避免频繁创建

  5. 日期格式化:统一日期格式,避免前端解析问题

  6. 使用注解:合理使用@SerializedName、@Expose等注解

相关推荐
2501_944711432 小时前
前端向架构突围系列 - 工程化(五):企业级脚手架的设计与落地
前端·架构
Apex Predator2 小时前
本地库导入到nexus
java·服务器·前端
仍然.2 小时前
Java---反射、枚举、lambda表达式 和 泛型进阶
java·开发语言
趁着年轻吃点苦2 小时前
宝塔面板部署指南
前端
0思必得02 小时前
[Web自动化] Selenium中Select元素操作方法
前端·python·selenium·自动化·html
小北方城市网2 小时前
JVM 调优实战指南:从问题排查到参数优化
java·spring boot·python·rabbitmq·java-rabbitmq·数据库架构
一叶星殇2 小时前
C# .NET 如何解决跨域(CORS)
开发语言·前端·c#·.net
Elieal2 小时前
Java项目密码加密实现详解
java·开发语言
运筹vivo@2 小时前
攻防世界: catcat-new
前端·web安全·php