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

如何在数据库中存储无固定模型的JSON为CLOB/JSON类型?含@RestController与Model示例

动态JSON/CLOB存储实现方案

刚好做过类似的需求,给你捋捋最简单的实现方式——不用定义固定的模型字段,完全动态存储任意JSON内容:

核心思路

  • 数据库层面:根据你的数据库类型选存储方式:
    • 通用方案:用CLOB类型存储JSON字符串,适配Oracle、MySQL、PostgreSQL等所有支持大文本的数据库
    • 性能优化方案:用数据库原生JSON类型(比如MySQL的json、PostgreSQL的jsonb),支持直接对JSON内容做查询操作
  • 模型层:只需要定义一个字段来承载整个JSON内容,不用写color、miles这类固定属性
  • 接口层:直接接收前端传来的JSON请求体,映射到模型的对应字段后存入数据库

1. Model编写示例

方案一:CLOB存储(通用型)

适合需要兼容多数据库的场景,用@Lob注解标记大文本字段:

import jakarta.persistence.*;
import lombok.Data; // 用Lombok简化getter/setter,也可以手动写

@Entity
@Table(name = "dynamic_json_data")
@Data
public class DynamicJsonEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 用CLOB存储完整的JSON字符串
    @Lob
    @Column(name = "json_content", nullable = false)
    private String jsonContent;
}

方案二:原生JSON字段存储(性能型)

适合用MySQL/PostgreSQL等支持原生JSON的数据库,直接用Map接收动态键值对:

import jakarta.persistence.*;
import lombok.Data;
import java.util.Map;

@Entity
@Table(name = "dynamic_json_data")
@Data
public class DynamicJsonEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 映射到数据库的JSON类型字段,自动完成Map和JSON的转换
    @Column(name = "json_content", nullable = false, columnDefinition = "json")
    private Map<String, Object> jsonContent;
}

2. @RestController编写示例

这里用JpaRepository来简化数据库操作(比EntityManager更易用),先定义一个Repository接口:

import org.springframework.data.jpa.repository.JpaRepository;

public interface DynamicJsonRepository extends JpaRepository<DynamicJsonEntity, Long> {
}

然后写Controller接口,支持接收并存储JSON:

import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
@RequestMapping("/api/json")
public class DynamicJsonController {

    @Autowired
    private DynamicJsonRepository jsonRepository;

    // 存储CLOB格式的JSON(接收字符串类型的JSON)
    @PostMapping("/save/clob")
    public String saveJsonAsClob(@RequestBody String jsonString) {
        DynamicJsonEntity entity = new DynamicJsonEntity();
        entity.setJsonContent(jsonString);
        jsonRepository.save(entity);
        return "JSON已存入CLOB,ID:" + entity.getId();
    }

    // 存储原生JSON格式(接收Map类型的JSON,自动解析键值对)
    @PostMapping("/save/native")
    public String saveJsonAsNative(@RequestBody Map<String, Object> jsonMap) {
        DynamicJsonEntity entity = new DynamicJsonEntity();
        entity.setJsonContent(jsonMap);
        jsonRepository.save(entity);
        return "JSON已存入原生JSON字段,ID:" + entity.getId();
    }

    // 新增查询接口,返回存储的JSON内容
    @GetMapping("/{id}")
    public Object getJsonById(@PathVariable Long id) {
        return jsonRepository.findById(id)
                .map(DynamicJsonEntity::getJsonContent)
                .orElse("未找到对应ID的JSON数据");
    }
}

额外说明

  • 如果用Oracle数据库,只需要用方案一的CLOB存储即可,Spring会自动处理字符串和CLOB的转换
  • 若使用MySQL的原生JSON字段,需要确保数据库驱动版本在8.0以上(自动支持JSON和Map的映射)
  • 你测试的时候直接POST你的示例JSON {"color": "Blue", "miles": 100, "vin": "1234"}到对应的接口就行,完全不用修改模型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:34:40