You need to enable JavaScript to run this app. 如何在Spring Boot中无需将JSON序列化为对象即可直接传递JSON
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot中无需将JSON序列化为对象即可直接传递JSON

实现方案说明

这种实现完全可行,你需要的本质是绕开「JSON反序列化为专属Spring Bean → 业务处理 → Bean序列化为JSON」的固定冗余链路,用通用JSON载体做透传,完全不需要为每类接口定义冗余的实体类。
你提到的「完全不借助Jackson、Gson等工具」不现实——Spring Boot处理HTTP请求的JSON编解码本身就是依赖这类工具实现的,你可以实现的是跳过所有和自定义业务Bean相关的转换步骤,直接操作通用JSON结构,整体链路确实比绑定POJO简洁很多。

核心实现逻辑
  • 接收请求时,用通用JSON类型(比如Jackson提供的JsonNode)作为@RequestBody的参数类型,直接拿到请求JSON的原始树结构,不需要绑定到自定义POJO
  • 直接把拿到的JsonNode对象透传到Repository层,不做任何实体转换
  • Repository层用JSON树API直接提取需要的查询参数,不需要定义入参Bean
  • 数据库查询后,直接把结果集映射为通用结构(比如List<Map<String,Object>>),再转成通用JSON类型返回,不需要定义出参Bean
  • Controller层拿到返回的通用JSON对象后直接返回,Spring会自动将其序列化为JSON响应给前端,不需要额外转换
参考代码示例

Controller层

直接接收原始JSON并透传,不需要定义入参/出参Bean:

@RestController
@RequestMapping("/api")
public class JsonPassThroughController {

    @Autowired
    private JsonPassThroughRepository jsonPassThroughRepository;

    @PostMapping("/query")
    public JsonNode passThroughQuery(@RequestBody JsonNode requestJson) {
        // 完全透传前端请求的原始JSON,不做任何转换
        return jsonPassThroughRepository.executeQuery(requestJson);
    }
}

Repository层

直接从原始JSON提取参数、执行查询、返回JSON结构:

@Repository
public class JsonPassThroughRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private ObjectMapper objectMapper; // Spring Boot默认自动配置该Bean,直接注入即可使用

    public JsonNode executeQuery(JsonNode requestJson) {
        // 直接从原始JSON读取参数,不需要定义入参实体
        Long userId = requestJson.get("userId").asLong();
        String queryDate = requestJson.get("queryDate").asText();

        // 执行查询,直接把结果映射为通用Map结构,不需要定义出参实体
        List<Map<String, Object>> queryResult = jdbcTemplate.queryForList(
            "SELECT id, content, create_time FROM user_oper_log WHERE user_id = ? AND DATE(create_time) = ?",
            userId, queryDate
        );

        // 直接把通用结果转成JsonNode返回,不需要做任何实体映射
        return objectMapper.valueToTree(queryResult);
    }
}

可选:完全透传原始JSON字符串

如果你连初步解析都不想在Controller层做,也可以直接用String类型接收请求体,全链路透传原始JSON字符串:

// Controller层方法
@PostMapping("/queryRaw")
public String passThroughRaw(@RequestBody String requestJsonStr) {
    return jsonPassThroughRepository.executeQueryRaw(requestJsonStr);
}

// Repository层方法
public String executeQueryRaw(String requestJsonStr) {
    try {
        JsonNode requestJson = objectMapper.readTree(requestJsonStr);
        Long userId = requestJson.get("userId").asLong();
        String queryDate = requestJson.get("queryDate").asText();

        List<Map<String, Object>> queryResult = jdbcTemplate.queryForList(
            "SELECT id, content, create_time FROM user_oper_log WHERE user_id = ? AND DATE(create_time) = ?",
            userId, queryDate
        );

        return objectMapper.writeValueAsString(queryResult);
    } catch (Exception e) {
        throw new RuntimeException("JSON处理失败", e);
    }
}
注意事项
  • 安全风险:如果需要从请求JSON中提取表名、字段名这类SQL拼接参数,一定要做白名单校验,避免SQL注入问题
  • 适用场景:这种方案适合快速迭代的原型接口、内部工具接口、参数/返回结构频繁变动的场景;如果是长期维护的核心业务接口,还是建议用POJO做参数校验和结构约束,避免后续无规范的结构变更带来维护成本
  • 你完全不需要为任何接口定义专属的入参/出参Bean,整个链路没有冗余的实体转换步骤

内容的提问来源于stack exchange,提问作者user3217883

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.13 10:06:05