关于fastjson的具体使用案例

好的!下面针对你提到的四个应用场景(前后端通信、日志记录、缓存与消息队列、配置文件解析),我将分别提供:

  • 具体需求描述
  • 使用 Fastjson 2(推荐版本)的完整代码示例
  • 说明关键点

环境前提 :Spring Boot 3.x + JDK 17+,使用 Fastjson 2com.alibaba.fastjson2:fastjson2


1. 前后端通信(RESTful API)

🔹 需求

实现一个用户注册接口:

  • 前端发送 JSON:{"username": "alice", "email": "alice@example.com"}
  • 后端接收并自动反序列化为 UserDTO 对象
  • 处理后返回 JSON 响应:{"id": 1001, "status": "success"}

🔹 代码实现

(1) 添加依赖(pom.xml
xml 复制代码
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.43</version>
</dependency>
(2) 配置 Fastjson 2 为 Spring Boot 默认 JSON 处理器
java 复制代码
// config/Fastjson2Config.java
import com.alibaba.fastjson2.support.config.FastJsonConfig;
import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class Fastjson2Config implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setWriterFeatures(); // 可添加格式化等特性
        converter.setFastJsonConfig(config);
        converters.add(0, converter); // 插入首位,优先使用
    }
}
(3) DTO 和 Controller
java 复制代码
// dto/UserDTO.java
public class UserDTO {
    private String username;
    private String email;
    // getters & setters
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

// dto/ResponseDTO.java
public class ResponseDTO {
    private Long id;
    private String status;
    // constructors, getters, setters
    public ResponseDTO(Long id, String status) {
        this.id = id;
        this.status = status;
    }
    // ... getters/setters
}

// controller/UserController.java
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/user")
public class UserController {

    @PostMapping("/register")
    public ResponseDTO register(@RequestBody UserDTO userDTO) {
        // 模拟业务处理
        System.out.println("接收到用户: " + userDTO.getUsername());
        return new ResponseDTO(1001L, "success");
    }
}

🔹 测试

bash 复制代码
curl -X POST http://localhost:8080/api/user/register \
  -H "Content-Type: application/json" \
  -d '{"username":"alice","email":"alice@example.com"}'

✅ 前端发送 JSON → 后端自动反序列化为 UserDTO → 返回 JSON 响应


2. 日志记录(结构化日志)

🔹 需求

在接口调用时,将请求体以 JSON 格式打印到日志,便于 ELK 收集分析。

🔹 代码实现

java 复制代码
// service/UserService.java
import com.alibaba.fastjson2.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private static final Logger logger = LoggerFactory.getLogger(UserService.class);

    public void processUser(UserDTO userDTO) {
        // 结构化日志:整个对象转 JSON
        logger.info("处理用户请求: {}", JSON.toJSONString(userDTO));

        // 也可只记录部分字段
        logger.warn("敏感操作 - 用户名: {}", JSON.toJSONString(userDTO.getUsername()));
    }
}

🔹 日志输出示例

复制代码
2025-12-26 10:00:00 INFO  UserService: 处理用户请求: {"username":"alice","email":"alice@example.com"}

✅ 便于日志系统按字段(如 email)检索或告警


3. 缓存与消息队列(Redis + Kafka 示例)

🔹 需求

  • 将用户对象存入 Redis(作为缓存)
  • 同时发送用户注册事件到 Kafka(JSON 格式)

🔹 代码实现

(1) 存入 Redis(使用 Spring Data Redis)
java 复制代码
// service/CacheService.java
import com.alibaba.fastjson2.JSON;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class CacheService {
    private final StringRedisTemplate redisTemplate;

    public CacheService(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void cacheUser(UserDTO user) {
        String key = "user:" + user.getUsername();
        String jsonValue = JSON.toJSONString(user);
        redisTemplate.opsForValue().set(key, jsonValue, 1, TimeUnit.HOURS);
    }

    public UserDTO getUser(String username) {
        String json = redisTemplate.opsForValue().get("user:" + username);
        return json != null ? JSON.parseObject(json, UserDTO.class) : null;
    }
}
(2) 发送 Kafka 消息
java 复制代码
// service/EventService.java
import com.alibaba.fastjson2.JSON;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

@Service
public class EventService {
    private final KafkaTemplate<String, String> kafkaTemplate;

    public EventService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void publishUserRegistered(UserDTO user) {
        String message = JSON.toJSONString(user);
        kafkaTemplate.send("user-registered-topic", message);
    }
}

✅ 对象 → JSON → 存储/传输 → 消费端再解析为对象


4. 配置文件解析(JSON 格式配置)

🔹 需求

项目使用 config/app-config.json 文件存储业务参数,启动时加载为 AppConfig 对象。

🔹 配置文件 src/main/resources/config/app-config.json

json 复制代码
{
  "maxRetry": 3,
  "timeoutMs": 5000,
  "featureFlags": {
    "enableNewUi": true,
    "useCache": false
  }
}

🔹 代码实现

java 复制代码
// config/AppConfig.java
public class AppConfig {
    private int maxRetry;
    private long timeoutMs;
    private FeatureFlags featureFlags;

    // Inner class
    public static class FeatureFlags {
        private boolean enableNewUi;
        private boolean useCache;
        // getters/setters
    }
    // getters/setters for all fields
}

// util/ConfigLoader.java
import com.alibaba.fastjson2.JSON;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;

@Component
public class ConfigLoader {
    public AppConfig loadAppConfig() throws Exception {
        ClassPathResource resource = new ClassPathResource("config/app-config.json");
        try (InputStream is = resource.getInputStream()) {
            byte[] bytes = is.readAllBytes();
            String json = new String(bytes, StandardCharsets.UTF_8);
            return JSON.parseObject(json, AppConfig.class);
        }
    }
}

// 在启动时加载
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Service;

@Service
public class InitService {
    private final ConfigLoader configLoader;

    public InitService(ConfigLoader configLoader) {
        this.configLoader = configLoader;
    }

    @PostConstruct
    public void init() {
        try {
            AppConfig config = configLoader.loadAppConfig();
            System.out.println("配置加载成功: 最大重试次数 = " + config.getMaxRetry());
        } catch (Exception e) {
            throw new RuntimeException("配置加载失败", e);
        }
    }
}

✅ 启动时自动加载 JSON 配置 → 转为强类型 Java 对象


总结

场景 核心 Fastjson 2 API 说明
前后端通信 @RequestBody + 自动反序列化 需配置 FastJsonHttpMessageConverter
日志记录 JSON.toJSONString(obj) 快速结构化输出
缓存/消息 toJSONString() / parseObject() 跨系统数据交换
配置解析 JSON.parseObject(jsonStr, Class) 替代 Properties/YAML 的灵活方案

💡 所有示例均基于 Fastjson 2,兼顾性能、安全性和 Spring Boot 3 兼容性。如需 Fastjson 1.x 示例(仅用于旧项目),可另行说明。

需要我提供完整可运行的 GitHub 项目结构或某个场景的单元测试吗?

相关推荐
墨着染霜华2 小时前
Spring Boot整合Kaptcha生成图片验证码:新手避坑指南+实战优化
java·spring boot·后端
码界奇点2 小时前
Java外功核心7深入源码拆解Spring Bean作用域生命周期与自动装配
java·开发语言·spring·dba·源代码管理
czlczl200209252 小时前
Spring Security @PreAuthorize 与自定义 @ss.hasPermission 权限控制
java·后端·spring
我爱学习好爱好爱2 小时前
Prometheus监控栈 监控java程序springboot
java·spring boot·prometheus
老华带你飞3 小时前
考试管理系统|基于java+ vue考试管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
阿蒙Amon3 小时前
C#每日面试题-属性和特性的区别
java·面试·c#
懒惰蜗牛3 小时前
Day66 | 深入理解Java反射前,先搞清楚类加载机制
java·开发语言·jvm·链接·类加载机制·初始化
赵庆明老师3 小时前
VS2026扩展插件Visual Commander
java·开发语言
额呃呃3 小时前
信号量唤醒线程的实际机制
java·开发语言·jvm