Json:前台对象数组传到后台解析

使用JsonArray解析JSON数据
本文介绍了如何使用JsonArray进行JSON数据的解析,并提供了JSON数据的前后台代码实现。包括了JSON数据的创建、发送与接收,以及如何将字符串类型的JSON数据转换为对象数组。

方法:使用JsonArray进行解析

步骤:

一、引入一系列JAR包

      要使程序便于解析json,首先引入json-lib包,son-lib包同时依赖于5个JAR包:(前5个为依赖包);

      由于刚开始笔者是随便下载这些包(没有管版本)导入程序,但没想到程序出现了兼容问题,为了使大家不再浪费时间,现给出经测试可用的一套包名及版本号;

      1.commons-beanutils-1.8.3.jar

      2.commons-collections-3.2.1.jar

      3.commons-lang-2.6.jar

      4.commons-logging-1.1.1.jar

      5.ezmorph-1.0.6.jar

      6.json-lib-2.4-jdk15.jar

二、前台代码

      datalist是类似这样的对象数据:

   var datalist= new Array();
   for ( var i = 1; i <= bookCount; i++) {
	var object = new Object();
	object.id = i;
	object.name = "同学"+i;
        datalist.push(object);		
   }


      前台传输对象数组datalist:

   function saveData(datalist){
	$.ajax({
		type:"POST",
		url:base +"/save",
		data:{"datalist":JSON.stringify(datalist)},
		dataType: "json",
		success:function (data){
		   
		},
		error:function (){
		     alert("insert serv wrong");
		}
	});
   }

三、后台代码

       后台获取到的list是string类型的,值为:

   [{"id":1,"name":"同学1"},{"id":2,"name":"同学2"}]

       后台转换得到对象对应值:

       注意:这样使用的话,引入JSONArray的类型为org.json而不是net.sf.json,笔者开始引入的是net.sf.json.JSONArray,但JSONObject.fromObject(obj)时报错报java.lang.reflect.InvocationTargetException错误。解决很久未果,偶然看一网友说用org.json比net.sf.json好用,就试了下。在此给大家提供个参考。

    public Object save(@Param("datalist")String list){		
	JSONArray jsonArray = new JSONArray(list);
	String id = jsonArray.getJSONObject(0).get("id");</span>//得到第一个同学的id
        String name = jsonArray.getJSONObject(0).get("name");</span>//得到第一个同学的name
       return true; 
    }


<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; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值