spring mvc 接收前台传来的json对象

本文介绍如何使用SpringMVC框架与jQuery AJAX进行有效交互,包括解决JSON数据传输问题及多维数据传递的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
1:自己研究的
    1) 页面ajax代码
     
Js代码 复制代码  收藏代码
  1.    
  2. msgObj = {"data":{"2013-11-08":3,"2013-11-07":5,"2013-11-06":3,"2013-11-05":12},"indata":{"2013-11-08":9,"2013-11-07":7,"2013-11-06":23,"2013-11-05":5}};  
  3. $.ajax({  
  4.                                      
  5.   
  6. type:'post',  
  7.                   url:'${projectPath}/update',  
  8.                   data:{"channelType":upchannel_type,"channel":upchannel,"day":upchannel_day,"startTime":upchannel_startTime,"endTime":upchannel_endTime,"database":upchannel_db,"source":backmsgObj,"up":msgObj},//msgobj是json对象  
  9.                   dataType:'text',//服务器返回的数据类型 可选XML ,Json jsonp script htmltext等  
  10.                   success:function(msg){  
  11.                           },  
  12.                   error:function(){  
  13.                   alert('error');  
  14.                   }  
  15.         })  
    2):javabean
Java代码 复制代码  收藏代码
  1. private String channel;  
  2.     private String channelType;  
  3.     private String day;  
  4.     private String startTime;  
  5.     private String endTime;  
  6.     private String database;  
  7.       
  8.     private Map<String,Map<String,String>> source;  
  9.     private Map<String,Map<String,String>> up;   //结构与js中的json对象结构一致  
private String channel;
	private String channelType;
	private String day;
	private String startTime;
	private String endTime;
	private String database;
	
	private Map<String,Map<String,String>> source;
	private Map<String,Map<String,String>> up;   //结构与js中的json对象结构一致
 3)controller modle
Java代码 复制代码  收藏代码
  1. @RequestMapping("/update")  
  2.     public String updateBandwidth(@ModelAttribute SearchBean searchBean, HttpServletRequest request,  
  3.             HttpServletResponse response) throws Exception{  
  4.         System.out.println("source :"+searchBean.getSource().toString());  
  5.         System.out.println("up :"+searchBean.getUp().toString());  
  6.         return  null;  
  7.     }  
@RequestMapping("/update")
	public String updateBandwidth(@ModelAttribute SearchBean searchBean, HttpServletRequest request,
			HttpServletResponse response) throws Exception{
		System.out.println("source :"+searchBean.getSource().toString());
		System.out.println("up :"+searchBean.getUp().toString());
		return  null;
	}
 
2:在网上找的,不过试了好久没成功
在用 spring mvc 写应用的时候发现jquery传递的【json数组对象】参数后台接收不到,多订单的处理,ajax请求:
Java代码     收藏代码
  1. var cmd =  {orders:[{"storeId":"0a1""address":"西斗门路2号""goods":[{"goodsId":"1"}, {"goodsId":"2"}, {"goodsId":"3"}]},{"storeId":"0a1""address":"西斗门路2号""goods":[{"goodsId":"4"}, {"goodsId":"4"}, {"goodsId":"5"}]}]}  
  2.               
  3. $.ajax({  
  4.                 url : url,  
  5.                 type : "POST",  
  6.                 datatype:"json",  
  7.                 data : cmd,  
  8.                 success : function(data, stats) {  
  9.                     if (stats == "success") {  
  10.                       //   window.location.href="/yc"  
  11.                     }  
  12.                 },  
  13.                 error : function(data) {  
  14.                     alert("请求失败");  
  15.                 }  
  16.             });  

开始如何传后台用 @RequestParam 去接收如何都接不到,分析下请求头,原来是json格式没转换
Java代码     收藏代码
  1. Origin:http://localhost  
  2. Referer:http://localhost/test/myorder  
  3. User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1  
  4. X-Requested-With:XMLHttpRequest  
  5. Form Dataview URL encoded  
  6. orders[0][storeId]:0a1  
  7. orders[0][address]:西斗门路2号  
  8. orders[0][goods][0][goodsId]:1  
  9. orders[0][goods][1][goodsId]:2  
  10. orders[0][goods][2][goodsId]:3  
  11. orders[1][storeId]:0a1  
  12. orders[1][address]:西斗门路2号  
  13. orders[1][goods][0][goodsId]:4  
  14. orders[1][goods][1][goodsId]:4  
  15. orders[1][goods][2][goodsId]:5  
  16. Response Headersview source  
  17. Content-Length:1051  
  18. Content-Type:text/html;charset=utf-8  
  19. Date:Mon, 26 Nov 2012 16:10:07 GMT  
  20. Server:Apache-Coyote/1.1  

通过观察,orders[0][storeId]:0a1  
orders[0][address]:西斗门路2号  
orders[0][goods][0][goodsId]:1 变成了多维数组的格式传递,没有按json对象的方式传递(原以为 jquery会自动转的,可惜我想多了,所以出现了乌龙)。  

下了个jquery的json插件,jquery.json-2.4.js 转了下json;但是问题又来了,传的格式正确但是后台还是接不到,打印了下request.getParameterMap(),参数按json格式传进来,但是接的方式又出现了问题,用string接肯定不行,String数组接也接不到,List也接不到,网上查查相关Controller的接收json对象的方式,需要用@RequestBody来进行接收,为了方便干脆把 orders去掉 直接用json数组
Javascript代码     收藏代码
  1. var cmd =  [{"storeId":"0a1""address":"西斗门路2号""goods":[{"goodsId":"1"}, {"goodsId":"2"}, {"goodsId":"3"}]},{"storeId":"0a1""address":"西斗门路2号""goods":[{"goodsId":"4"}, {"goodsId":"4"}, {"goodsId":"5"}]}]  
后台用
Java代码     收藏代码
  1. (@RequestBody List orders)  
这种方法来接  

检查下参数写法,应该没错,测试之后还是有问题 报了这样一个错误:  
POST http://localhost/test/order 415 (Unsupported Media Type)  这个问题应该是前台请求过程中没有指明contentType,ajax中加上contentType: "application/json; charset=utf-8",再测试,果然可以了。完整代码如下:
ajax:  
Javascript代码     收藏代码
  1. var cmd =  [{"storeId":"0a1""address":"西斗门路2号""goods":[{"goodsId":"1"}, {"goodsId":"2"}, {"goodsId":"3"}]},{"storeId":"0a1""address":"西斗门路2号""goods":[{"goodsId":"4"}, {"goodsId":"4"}, {"goodsId":"5"}]}]  
  2.               
  3. $.ajax({  
  4.                 url : url,  
  5.                 type : "POST",  
  6.                 datatype:"json",  
  7.                          contentType: "application/json; charset=utf-8",  
  8.                 data : $toJSON(cmd),  
  9.                 success : function(data, stats) {  
  10.                     if (stats == "success") {  
  11.                       //   window.location.href="/yc"  
  12.                     }  
  13.                 },  
  14.                 error : function(data) {  
  15.                     alert("请求失败");  
  16.                 }  
  17.             });  


Controller method:  
Java代码     收藏代码
  1. @RequestMapping(value = "/order", method = RequestMethod.POST)  
  2.  public  ModelAndView order(@RequestBody List<Map<String,Object>> orders) {  
  3.         System.out.println("orders size:" + orders.size());  
  4. }  
<think>我们有一个任务:在Spring Boot后台接收前台传递的列表类型数据,并将其转换为JSON格式存储到数据库。 步骤分解: 1. 前台传递列表数据(可能是通过HTTP请求的body,例如JSON格式) 2. Spring Boot控制器接收数据,可以使用`@RequestBody`注解将请求体映射到Java对象。 3. 将接收到的对象(可能是List)转换为JSON字符串。我们可以使用如Fastjson、Jackson等库,但Spring Boot默认使用Jackson,所以我们可以直接利用它。 4. 将JSON字符串存储到数据库。通常,我们会在实体类中定义一个字段,这个字段在数据库中以文本类型(如TEXT、VARCHAR等)存储JSON字符串。 具体实现: 假设我们有一个实体类,例如`User`,但是我们想存储一个任意类型的列表,比如一个`List<String>`或者更复杂的对象列表。我们可以设计一个实体类,其中包含一个字符串字段来存储JSON,同时可以包含其他字段(如id、创建时间等)。 例如,我们创建一个实体类`JsonData`: ```java @Entity public class JsonData { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(columnDefinition = "TEXT") private String jsonContent; // 用于存储JSON字符串 // 其他字段(可选)如创建时间等 // 构造方法、getter和setter } ``` 在控制器中,我们可以接收一个List(可以是任意类型,比如`List<MyObject>`,其中`MyObject`是自定义的类),然后将其转换为JSON字符串。 示例控制器: ```java @RestController @RequestMapping("/api/data") public class DataController { @Autowired private JsonDataRepository jsonDataRepository; // 假设有对应的Repository @PostMapping public ResponseEntity<String> saveJsonData(@RequestBody List<Object> dataList) { // 将List转换为JSON字符串 ObjectMapper objectMapper = new ObjectMapper(); // Jackson的ObjectMapper try { String jsonString = objectMapper.writeValueAsString(dataList); JsonData jsonData = new JsonData(); jsonData.setJsonContent(jsonString); jsonDataRepository.save(jsonData); return ResponseEntity.ok("Data saved successfully"); } catch (JsonProcessingException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error converting data to JSON"); } } } ``` 注意:这里我们直接使用了`List<Object>`,但实际中我们可能希望指定具体的类型,比如`List<MyCustomClass>`,这样在转换时更安全。如果类型不固定,使用`List<Object>`也是可以的。 另外,我们也可以使用泛型来接收不同的列表类型,但Spring MVC在反序列化时可能需要知道具体的类型信息。如果前端传递的是复杂对象列表,我们可以定义一个对应的DTO类。 例如,如果前端传递的是用户列表,我们可以: ```java public class UserDTO { private String name; private int age; // getter and setter } ``` 然后在控制器中: ```java @PostMapping("/users") public ResponseEntity<String> saveUsers(@RequestBody List<UserDTO> users) { // 转换List<UserDTO>为JSON字符串 // ... 同上 } ``` 这样,Spring会根据UserDTO的结构来解析请求体中的JSON。 存储到数据库:我们使用JPA(如上例)或者其他的数据访问技术将包含JSON字符串的实体保存到数据库。 注意:在实体类中,我们使用`@Column(columnDefinition = "TEXT")`来指定该字段为长文本类型,适合存储JSON字符串。 另外,如果数据库支持JSON类型(如MySQL 5.7以上、PostgreSQL等),我们也可以使用JSON类型,这样数据库可以对JSON进行一些操作。在JPA中,我们可以使用`@Column(columnDefinition = "JSON")`(如果数据库支持)。但这里为了通用性,我们使用TEXT。 如果使用MySQL 5.7以上,我们可以将字段类型设置为JSON,这样在查询时可以使用JSON函数。但存储时我们还是以字符串形式存入,只要符合JSON格式即可。 总结步骤: 1. 创建实体类,包含一个字符串字段用于存储JSON。 2. 创建控制器,使用`@RequestBody`接收前端传来的列表数据(可以是List,也可以是自定义对象列表)。 3. 使用Jackson的`ObjectMapper`将列表对象转换为JSON字符串。 4. 将JSON字符串存入实体类,并保存到数据库。 相关问题: 1. 如何在前端发送列表数据到Spring Boot后端? 2. Spring Boot中如何配置数据库以支持JSON类型的字段? 3. 除了使用TEXT类型存储JSON,还有哪些存储方式? 4. 在Spring Boot中如何自定义JSON序列化和反序列化? 5. 如何从数据库中读取JSON字符串并转换为Java对象列表?</think>### Java Spring Boot 接收列表数据并存储为 JSON 的解决方案 #### 1. **创建实体类** 在实体类中定义用于存储 JSON 的字段,使用 `@Column(columnDefinition = "JSON")` 注解标记: ```java import javax.persistence.*; import com.fasterxml.jackson.databind.JsonNode; @Entity public class DataEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(columnDefinition = "JSON") private JsonNode jsonData; // 存储JSON格式数据 // Getter & Setter } ``` #### 2. **创建 DTO 接收请求数据** 定义数据传输对象接收前端列表数据: ```java import java.util.List; public class DataRequestDTO { private List<Object> itemList; // 接收任意类型列表 // Getter & Setter } ``` #### 3. **控制器实现** 在 Controller 中接收请求并转换数据: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/data") public class DataController { private final ObjectMapper objectMapper; // Spring Boot 自动注入 @PostMapping public ResponseEntity<String> saveData(@RequestBody DataRequestDTO request) { // 将列表转换为JSON节点 JsonNode jsonNode = objectMapper.valueToTree(request.getItemList()); // 创建实体并保存 DataEntity entity = new DataEntity(); entity.setJsonData(jsonNode); dataRepository.save(entity); return ResponseEntity.ok("数据保存成功"); } } ``` #### 4. **数据库配置** 在 `application.yml` 中配置数据库支持 JSON 类型(以 MySQL 为例): ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/db_name?useSSL=false&createDatabaseIfNotExist=true username: root password: root jpa: properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect # 支持JSON类型 ddl-auto: update ``` #### 5. **前端请求示例** 前端发送 JSON 格式的列表数据: ```json POST /api/data Content-Type: application/json { "itemList": [ {"name": "Item1", "value": 100}, {"name": "Item2", "value": 200}, ["nested", "array"] ] } ``` ### 关键点说明 1. **JSON 转换** - 使用 Spring Boot 自动配置的 `ObjectMapper` 进行类型转换 - `JsonNode` 类型可存储任意 JSON 结构(对象/数组) 2. **数据库支持** - MySQL 5.7+ 或 PostgreSQL 原生支持 JSON 类型 - 需使用 `MySQL8Dialect` 方言(旧版用 `MySQL57Dialect`) 3. **类型安全** - 接收 `List<Object>` 可处理混合类型数据 - 如需严格类型可定义具体 DTO 如 `List<ItemDTO>` 4. **存储优势** - 直接存储 JSON 避免关联表查询 - 支持动态数据结构变更 - 可通过 JSON 路径查询(如 MySQL 的 `JSON_EXTRACT()`)[^1] ### 常见问题处理 **Q1: 如何查询 JSON 字段?** ```java @Query("SELECT e FROM DataEntity e WHERE FUNCTION('JSON_EXTRACT', e.jsonData, '$.itemList[0].name') = :name") List<DataEntity> findByFirstName(@Param("name") String name); ``` **Q2: 前端如何发送 FormData 列表?** 使用 `@RequestParam` 接收数组: ```java @PostMapping("/form") public void saveForm(@RequestParam("items") List<String> items) { // 直接处理字符串列表 } ``` **Q3: 如何验证 JSON 结构?** 在 DTO 中添加验证注解: ```java public class DataRequestDTO { @NotNull @Size(min = 1, message = "列表不能为空") private List<@Valid ItemDTO> itemList; } ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值