关于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 项目结构或某个场景的单元测试吗?

相关推荐
num_killer1 天前
小白的Langchain学习
java·python·学习·langchain
期待のcode1 天前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐1 天前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲1 天前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红1 天前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥1 天前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v1 天前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地1 天前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209251 天前
Guava Cache 原理与实战
java·后端·spring
yangminlei1 天前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot