在开发springMVC接收数据,反序列化对象的时候,遇到了日期格式不能正常转化的问题。
例如:
public class Entity{
private Date date ;
//get set方法略
}
前端传的json数据格式:{"date":"2016-11-11 10:52"}
使用@requestBody Entity entity方式接收数据报错。
查了下官方文档(http://docs.spring.io/spring/docs/4.3.1.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#rest-mapping-json-converter),发现下面一段文字:
You convert the request body to the method argument by using an HttpMessageConverter
. HttpMessageConverter
is responsible for converting from the HTTP request message to an object and converting from an object to the HTTP response body. The RequestMappingHandlerAdapter
supports the @RequestBody
annotation with the following default HttpMessageConverters
:
大意是springmvc通过HttpMessageConverter对类型匹配,并转换。
紧接着去看了下,springMVC使用的Message Converters.
发现springMVC 对于json格式的请求使用
MappingJackson2XmlHttpMessageConverter做处理。
那么了解JACKson原理就能帮我们解决问题。
这里有一篇文章讲述了如何使用反序列化来处理格式问题。http://jackyrong.iteye.com/blog/2005323
使用这种方式,对于每种不同的格式化数据,都得去写一个处理类,并且还要注解,显得很麻烦。
于是我想到了第二种方式。
接收数据的时候,我使用string类型接收,然后使用阿里的fastjson去转换数据。
例如:
@RequestBody String myEntity
Entity entity = JSONObject.parseObject(myEntity,Entity.class);
@JSONField(format="yyyy-MM-dd HH:mm")
private Date date ; //格式化
但是再使用这种方式转换的时候,发现日期格式“2016-11-11 10:52”,也不能正确转换。
查了相关文档发现阿里支持的反序列化日期格式为:
- ISO-8601日期格式
- yyyy-MM-dd
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd HH:mm:ss.SSS
- 毫秒数字
- 毫秒数字字符串
- .NET JSON日期格式
- new Date(1982932381111)
显然,这些不能满足我的需求。
于是在github(https://github.com/alibaba/fastjson/releases)上下载fastJson源码修改后编译:
找到com\alibaba\fastjson\util\TypeUtils.java对下面一段代码编辑:
if (value instanceof String) { String strVal = (String) value; JSONScanner dateLexer = new JSONScanner(strVal); try { if (dateLexer.scanISO8601DateIfMatch(false)) { Calendar calendar = dateLexer.getCalendar(); return calendar.getTime(); } } finally { dateLexer.close(); } if (strVal.startsWith("/Date(") && strVal.endsWith(")/")) { String dotnetDateStr = strVal.substring(6, strVal.length() - 2); strVal = dotnetDateStr; } if (strVal.indexOf('-') != -1) { String format; if (strVal.length() == JSON.DEFFAULT_DATE_FORMAT.length()) { format = JSON.DEFFAULT_DATE_FORMAT; } else if (strVal.length() == 10) { format = "yyyy-MM-dd"; } else if (strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) { format = "yyyy-MM-dd HH:mm:ss"; } else { format = "yyyy-MM-dd HH:mm:ss.SSS"; } SimpleDateFormat dateFormat = new SimpleDateFormat(format, JSON.defaultLocale); dateFormat.setTimeZone(JSON.defaultTimeZone); try { return (Date) dateFormat.parse(strVal); } catch (ParseException e) { throw new JSONException("can not cast to Date, value : " + strVal); } } if (strVal.length() == 0) { return null; } longValue = Long.parseLong(strVal); }
对这段代码进行扩展:
if (strVal.indexOf('-') != -1) { String format; if (strVal.length() == JSON.DEFFAULT_DATE_FORMAT.length()) { format = JSON.DEFFAULT_DATE_FORMAT; } else if (strVal.length() == 10) { format = "yyyy-MM-dd"; } else if (strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) { format = "yyyy-MM-dd HH:mm:ss"; } else { format = "yyyy-MM-dd HH:mm:ss.SSS";
}
编译后放入项目中,即可。
总结:遇到问题时候,查找官方文档,能帮助迅速定位问题,至于如何解决问题,仁者见仁智者见智。
相关推荐
在Web应用中,JSON经常用于前后端数据交换,因为它可以被JavaScript直接处理,且序列化和反序列化的效率高。 在"web-demo"这个项目中,你可以看到一个完整的Web应用示例,包括前端HTML、CSS、JavaScript文件以及...
8. **错误处理**:当JSON序列化或反序列化失败时,Spring MVC会自动抛出异常并返回一个错误响应。为了提供更友好的错误信息,可以配置异常处理器或者自定义错误视图。 总结起来,Spring MVC对JSON的支持主要依赖于...
1. Jackson库:Spring MVC默认使用Jackson库进行JSON序列化和反序列化。Jackson提供了`ObjectMapper`类,用于将Java对象转换为JSON字符串,反之亦然。 2. @RequestBody与@RequestParam:在控制器方法中,我们可以...
为了确保JSON序列化和反序列化时的性能和灵活性,我们还可以对Jackson库进行一些高级配置,例如忽略空值、自定义日期格式、添加自定义序列化和反序列化逻辑等。这可以通过创建一个`ObjectMapper`实例并在Spring配置...
在Ajax请求中,通常JSON被用作数据传输格式,因为它可以直接被JavaScript解析为对象,无需额外的序列化和反序列化过程。 **Spring MVC、Ajax和JSON的结合** 在Spring MVC中,Controller可以返回JSON格式的数据响应...
此外,我们还可以自定义JSON序列化和反序列化的规则,例如忽略某些字段、自定义日期格式等,通过创建Jackson的`ObjectMapper`实例并配置相关属性来实现。 最后,关于RAR文件,它是Microsoft的压缩文件格式,用于...
为了实现这一功能,我们需要依赖于Jackson库,这是一个强大的序列化和反序列化库,能够将Java对象转换为JSON格式,反之亦然。这里提供的jar包是Jackson库的一部分,它们包括了以下几个关键组件: 1. `jackson-...
`ObjectMapper`类在这个库中被完整实现,它提供了丰富的API来处理对象与JSON之间的转换,例如`readValue()`和`writeValueAsString()`方法,分别用于从JSON字符串反序列化对象和将Java对象序列化成JSON字符串。...
若要返回JSON数据,确保项目已引入Jackson库,并且返回类型可被Jackson序列化。 - 对于XML数据,Spring MVC默认使用了JAXB库(Jaxb2RootElementHttpMessageConverter)。返回类型需要有对应的XML注解(如`@...
`@RequestBody`和`@ResponseBody`使得JSON数据与Java对象之间的转换变得简单,而Jackson库提供了丰富的功能来满足各种序列化需求。通过理解这些核心概念和实践,你就能在Spring MVC中有效地处理JSON格式的读取和显示...
它提供了多种功能,包括序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象)。 - `jackson-databind-2.4.2.jar`:这是Jackson的核心模块,包含了`ObjectMapper`类,它是Jackson的主要...
4. **处理日期和自定义类型**: Jackson允许我们自定义日期格式或者注册自定义的序列化和反序列化逻辑,通过注解或配置`ObjectMapper`来实现。 通过以上步骤,即使在Spring MVC 3.2及以下版本,我们也能成功地使用...
- 在Spring 4中,可以通过配置`Jackson2ObjectMapperBuilder`来定制JSON序列化和反序列化的规则,例如日期格式、时间戳格式、自定义序列化器等。 - Spring 3的配置相对简单,通常只需要在`DispatcherServlet`的...
在示例中,如果没有`@ResponseBody`,我们需要手动处理JSON序列化,就像`writeJson`方法那样。但是有了`@ResponseBody`,我们可以简化这个过程,让Spring MVC自动完成这个任务。 在使用`@RequestBody`接收多层嵌套...
3. **JSON序列化与反序列化**:在Spring MVC中,你可以通过使用`@RequestBody`和`@ResponseBody`注解来实现JSON数据的传递。`@RequestBody`用于将HTTP请求体中的JSON数据转换为Java对象,而`@ResponseBody`则将方法...
SpringMVC支持JSON序列化和反序列化,允许服务器将Java对象转换为JSON字符串发送给客户端,以及将客户端发送的JSON数据转换回Java对象。这个过程中,Jackson库扮演了关键角色。 Jackson是Java领域中广泛使用的JSON...
一旦配置完成,Spring MVC会自动使用Jackson进行JSON的序列化和反序列化。 接下来,我们需要检查前端发送请求时的Accept头。确保它包含"application/json",这可以通过浏览器的开发者工具查看。例如,使用jQuery的$...
它们简化了数据交换的过程,减少了手动序列化和反序列化的代码,提高了开发效率。通过理解这两个注解的工作机制,开发者可以更好地设计和实现高效、灵活的Web服务。 需要注意的是,虽然Spring MVC默认支持JSON和XML...
- Controller方法接收参数,SpringMVC会自动将JSON数据转化为Java对象,通过`@RequestBody`注解注入到方法参数中。 - Controller处理业务逻辑后,可能需要返回JSON数据。通过`@ResponseBody`注解,SpringMVC会调用...
2. **配置对象转换**:如果你需要自定义JSON序列化和反序列化的规则,可以通过`ObjectMapper`进行设置。例如,你可能想要忽略某些字段,或者自定义日期格式: ```java @Bean public ObjectMapper objectMapper() { ...