LocalDateTime返回前端数据为数组问题

本文记录了在Spring Boot应用中,如何解决LocalDateTime数据返回前端后被序列化为数组的问题。通过配置类加入一行配置,避免了日期时间显示格式问题,适用于不同环境下的解决方案。

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

问题描述:

使用spring-boot 2.1.16.RELEASE,后台LocalDateTime类型的数据,返回到前端后解析成了数组,导致数据不显示问题.

原因分析:

默认序列化情况下会使用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。使用这个解析时就会打印出数组。

解决方法:

在配置类中加入一行配置,问题得到解决
在这里插入图片描述
这个问题,在不同的环境中,可能会有不同的解决方法,这里只做一个简单记录.

学习注定是一条漫长又艰苦的道路,没有捷径可言,所有人都一样。熬过去,你就赢了!

@Configuration public class BeanConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer customizeJackson2ObjectMapper() { return builder -> { SimpleModule longModule = new SimpleModule(); longModule.addSerializer(Long.TYPE, ToStringSerializer.instance); longModule.addSerializer(Long.class, ToStringSerializer.instance); JavaTimeModule timeModule = new JavaTimeModule(); timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateUtils.DATE_TIME_FORMATTER)); timeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateUtils.DATE_TIME_FORMATTER)); timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE)); timeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE)); timeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME)); timeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME)); builder.modules(longModule, timeModule); builder.postConfigurer(mapper -> { mapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, true);//忽略循环引用 mapper.configure(SerializationFeature.WRITE_SELF_REFERENCES_AS_NULL, true);//循环引用写入null mapper.setSerializationInclusion(Include.NON_NULL); mapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);// 兼容高德地图api }); }; } }
03-08
<think>嗯,用户想知道如何在后端解析前端传来的数组参数。首先,我需要回忆一下之前看到的引用内容。引用[1]提到前端数组转为JSON字符串,后端用JsonUtil解析。引用[2]说axios传数组时,后端用@RequestBody接收List,但遇到了请求体缺失的问题。引用[3]则讲到后端如何转换JSON数组到List,再转为数组处理。 首先,用户的问题是关于后端如何解析前端传来的数组参数。常见的场景可能有几种:GET请求的查询参数、POST表单的数组,或者通过JSON传递的数组。根据不同的传递方式,后端处理的方法也不同。 比如,如果是GET请求带数组前端可能用逗号分隔的字符串,后端用split分割。这在Spring Boot中可以用@RequestParam接收字符串再处理。如果是表单提交的数组,比如多个同名参数,后端可以直接用数组或List接收,Spring MVC会自动绑定。 对于POST JSON数据的情况,比如前端用axios发送JSON数组,后端需要用@RequestBody注解,并配合对应的解析工具,比如Jackson。这时候需要确保请求头是application/json,并且数据结构匹配。如果遇到问题,可能需要检查JSON格式是否正确,或者是否有配置消息转换器。 另外,引用里提到的问题,比如@RequestBody接收不到参数,可能是因为没有正确的Content-Type,或者前端传递的数据格式不对。比如在DELETE请求中传数据,需要注意有些客户端库可能不支持在DELETE请求中发送请求体,这时候可能需要改用POST,或者将参数放在URL中。 还需要考虑不同的后端框架,处理方式可能不同。比如在Spring Boot中使用List接收参数时,需要确保参数名一致,或者使用@RequestParam注解指定名称。如果使用其他框架,可能需要不同的注解或方法。 总结一下,用户的问题需要分情况讨论,不同的前端传递方式对应不同的后端解析方法。要确保前后端的数据格式一致,比如JSON字符串需要正确解析为数组或List。同时要注意HTTP方法和请求头的设置,避免出现接收不到参数的情况。此外,处理异常情况,比如字符串中的引号问题,可能需要替换处理,如引用[1]中的replaceAll方法。</think>### 后端解析前端数组参数的方法 #### 1. **GET请求传参(查询参数或路径参数)** - **场景**:前端通过URL参数传递数组(如`?ids=1,2,3`)。 - **后端解析**: ```java // Spring Boot示例 @GetMapping("/example") public void handleRequest(@RequestParam("ids") String ids) { String[] idArray = ids.split(","); // 手动分割字符串为数组 // 或直接使用List接收(需框架支持) List<String> idList = Arrays.asList(idArray); } ``` #### 2. **POST表单传参(Content-Type: application/x-www-form-urlencoded)** - **场景**:前端通过表单提交同名参数多次(如`<input name="ids" value="1">`, `<input name="ids" value="2">`)。 - **后端解析**: ```java // Spring MVC示例 @PostMapping("/example") public void handleRequest(@RequestParam("ids") List<Integer> ids) { // 直接绑定为List或数组 } ``` #### 3. **POST JSON传参(Content-Type: application/json)** - **场景**:前端通过JSON传递数组(如`[1, 2, 3]`)。 - **后端解析**: ```java // Spring Boot示例(需Jackson库支持) @PostMapping("/example") public void handleRequest(@RequestBody List<Integer> ids) { // 直接解析为List或数组 } ``` #### 4. **处理复杂JSON结构** - **场景**:前端传递嵌套数组或对象(如`{"data": [1, 2, 3]}`)。 - **后端解析**: ```java // 定义DTO类接收 public class RequestDTO { private List<Integer> data; // getter/setter } @PostMapping("/example") public void handleRequest(@RequestBody RequestDTO request) { List<Integer> data = request.getData(); } ``` #### 5. **解决常见问题** - **引号转义问题**:若前端传递的JSON字符串包含特殊符号(如`"`),需替换处理: ```java String sanitized = rawString.replaceAll(""", "\""); ``` - **请求体缺失问题**:确保请求方法(如DELETE)支持请求体,并配置消息转换器[^2]。 - **类型转换错误**:使用工具类(如`JsonUtil.parseObject()`)将字符串转为目标类型[^1][^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值