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

相关推荐
侠客行03178 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪8 小时前
深入浅出LangChain4J
java·langchain·llm
老毛肚10 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎10 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Yvonne爱编码11 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚11 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂11 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
fuquxiaoguang11 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
琹箐11 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
__WanG11 小时前
JavaTuples 库分析
java