You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot如何接收嵌套结构的逻辑表达式类型RequestBody请求

解决方案

你对Baeldung文档的理解存在偏差,这类递归嵌套的树形JSON结构完全可以通过Spring Boot自带的Jackson序列化框架完成自动映射,不需要将JSON转为字符串传递,以下是最优实现方案:

方案1:轻量快速实现(无需修改前端JSON结构)

1. 定义递归映射实体类

首先定义请求体根类和表达式节点类,Jackson会自动识别嵌套结构完成映射:

// 请求体根结构
@Data
public class ExpressionRequest {
    private String id;
    private ExpressionNode fullexpression;
}

// 递归表达式节点类
@Data
public class ExpressionNode {
    // left和right支持两种类型:字符串操作数、嵌套的ExpressionNode节点
    private Object left;
    private String operator;
    private Object right;
}

2. 编写REST控制器

直接用@RequestBody接收实体类即可,框架会自动完成JSON到Java对象的转换:

@RestController
@RequestMapping("/api/logic")
public class ExpressionController {

    @PostMapping("/upload")
    public String handleExpressionUpload(@RequestBody ExpressionRequest request) {
        // 此时request已完成自动映射,可直接调用递归方法处理逻辑
        String logicExp = parseNodeToExp(request.getFullexpression());
        return "解析成功,表达式为:" + logicExp;
    }

    // 递归转换节点为逻辑表达式字符串的示例实现
    private String parseNodeToExp(ExpressionNode node) {
        if (node == null) return "";
        String leftPart = node.getLeft() instanceof ExpressionNode 
            ? "(" + parseNodeToExp((ExpressionNode) node.getLeft()) + ")"
            : node.getLeft().toString();
        String rightPart = node.getRight() instanceof ExpressionNode
            ? "(" + parseNodeToExp((ExpressionNode) node.getRight()) + ")"
            : node.getRight().toString();
        return String.format("%s %s %s", leftPart, node.getOperator(), rightPart);
    }
}

方案2:类型安全实现(适合大型项目)

如果要避免Object类型带来的强制转换风险,可以使用Jackson多态反序列化能力,定义类型安全的实体结构,仅需前端在JSON中新增type字段区分节点类型即可:

// 表达式节点顶层接口
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = OperandNode.class, name = "operand"),
    @JsonSubTypes.Type(value = LogicNode.class, name = "logic")
})
public interface ExpressionNode {}

// 操作数节点
@Data
public class OperandNode implements ExpressionNode {
    private String value;
}

// 逻辑运算节点
@Data
public class LogicNode implements ExpressionNode {
    private ExpressionNode left;
    private String operator;
    private ExpressionNode right;
}

注意事项

  • Spring Boot默认集成的Jackson已原生支持递归结构映射,无需额外引入依赖
  • 逻辑表达式为树形结构,不会出现循环引用问题,无需额外配置Jackson序列化规则
  • 可通过JSR-380校验注解(如@NotBlank、@Pattern)在实体类上完成参数合法性校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:06:08