`
betakoli
  • 浏览: 169044 次
社区版块
存档分类
最新评论

springMVC requestBody获取json 反序列化,日期格式问题

 
阅读更多

在开发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 HttpMessageConverterHttpMessageConverter 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 @RequestBodyannotation 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"; 

                } 

 

编译后放入项目中,即可。

 

总结:遇到问题时候,查找官方文档,能帮助迅速定位问题,至于如何解决问题,仁者见仁智者见智。

 

分享到:
评论

相关推荐

    Java后台服务器Maven+SpringMVC+Ajax+@RequestBody+Json传输

    在Web应用中,JSON经常用于前后端数据交换,因为它可以被JavaScript直接处理,且序列化和反序列化的效率高。 在"web-demo"这个项目中,你可以看到一个完整的Web应用示例,包括前端HTML、CSS、JavaScript文件以及...

    springmvc对json支持

    8. **错误处理**:当JSON序列化或反序列化失败时,Spring MVC会自动抛出异常并返回一个错误响应。为了提供更友好的错误信息,可以配置异常处理器或者自定义错误视图。 总结起来,Spring MVC对JSON的支持主要依赖于...

    SpringMVC-9 处理JSON数据

    1. Jackson库:Spring MVC默认使用Jackson库进行JSON序列化和反序列化。Jackson提供了`ObjectMapper`类,用于将Java对象转换为JSON字符串,反之亦然。 2. @RequestBody与@RequestParam:在控制器方法中,我们可以...

    springmvc操作json数据所需的jar包

    为了确保JSON序列化和反序列化时的性能和灵活性,我们还可以对Jackson库进行一些高级配置,例如忽略空值、自定义日期格式、添加自定义序列化和反序列化逻辑等。这可以通过创建一个`ObjectMapper`实例并在Spring配置...

    springMVC+ajax+json

    在Ajax请求中,通常JSON被用作数据传输格式,因为它可以直接被JavaScript解析为对象,无需额外的序列化和反序列化过程。 **Spring MVC、Ajax和JSON的结合** 在Spring MVC中,Controller可以返回JSON格式的数据响应...

    springmvc-json-lib.rar

    此外,我们还可以自定义JSON序列化和反序列化的规则,例如忽略某些字段、自定义日期格式等,通过创建Jackson的`ObjectMapper`实例并配置相关属性来实现。 最后,关于RAR文件,它是Microsoft的压缩文件格式,用于...

    springMVC post方法接收json参数jar包

    为了实现这一功能,我们需要依赖于Jackson库,这是一个强大的序列化和反序列化库,能够将Java对象转换为JSON格式,反之亦然。这里提供的jar包是Jackson库的一部分,它们包括了以下几个关键组件: 1. `jackson-...

    springmvc中json转换的jar

    `ObjectMapper`类在这个库中被完整实现,它提供了丰富的API来处理对象与JSON之间的转换,例如`readValue()`和`writeValueAsString()`方法,分别用于从JSON字符串反序列化对象和将Java对象序列化成JSON字符串。...

    SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)

    若要返回JSON数据,确保项目已引入Jackson库,并且返回类型可被Jackson序列化。 - 对于XML数据,Spring MVC默认使用了JAXB库(Jaxb2RootElementHttpMessageConverter)。返回类型需要有对应的XML注解(如`@...

    SpringMVC JSON格式的读取和显示

    `@RequestBody`和`@ResponseBody`使得JSON数据与Java对象之间的转换变得简单,而Jackson库提供了丰富的功能来满足各种序列化需求。通过理解这些核心概念和实践,你就能在Spring MVC中有效地处理JSON格式的读取和显示...

    springmvc加入json支持.zip

    它提供了多种功能,包括序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象)。 - `jackson-databind-2.4.2.jar`:这是Jackson的核心模块,包含了`ObjectMapper`类,它是Jackson的主要...

    jack-json包和配置,springmvc3.2及以下json格式支持

    4. **处理日期和自定义类型**: Jackson允许我们自定义日期格式或者注册自定义的序列化和反序列化逻辑,通过注解或配置`ObjectMapper`来实现。 通过以上步骤,即使在Spring MVC 3.2及以下版本,我们也能成功地使用...

    springmvc转json所需jar

    - 在Spring 4中,可以通过配置`Jackson2ObjectMapperBuilder`来定制JSON序列化和反序列化的规则,例如日期格式、时间戳格式、自定义序列化器等。 - Spring 3的配置相对简单,通常只需要在`DispatcherServlet`的...

    springMvc注解之 ResponseBody和 RequestBody.docx

    在示例中,如果没有`@ResponseBody`,我们需要手动处理JSON序列化,就像`writeJson`方法那样。但是有了`@ResponseBody`,我们可以简化这个过程,让Spring MVC自动完成这个任务。 在使用`@RequestBody`接收多层嵌套...

    SpringMVC中使用JSON传递数据时用的jar包

    3. **JSON序列化与反序列化**:在Spring MVC中,你可以通过使用`@RequestBody`和`@ResponseBody`注解来实现JSON数据的传递。`@RequestBody`用于将HTTP请求体中的JSON数据转换为Java对象,而`@ResponseBody`则将方法...

    SpringMVC的json依赖jar包

    SpringMVC支持JSON序列化和反序列化,允许服务器将Java对象转换为JSON字符串发送给客户端,以及将客户端发送的JSON数据转换回Java对象。这个过程中,Jackson库扮演了关键角色。 Jackson是Java领域中广泛使用的JSON...

    SpringMVC框架中传递JSON数据时前台报406错误解决办法

    一旦配置完成,Spring MVC会自动使用Jackson进行JSON的序列化和反序列化。 接下来,我们需要检查前端发送请求时的Accept头。确保它包含"application/json",这可以通过浏览器的开发者工具查看。例如,使用jQuery的$...

    SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(上)

    它们简化了数据交换的过程,减少了手动序列化和反序列化的代码,提高了开发效率。通过理解这两个注解的工作机制,开发者可以更好地设计和实现高效、灵活的Web服务。 需要注意的是,虽然Spring MVC默认支持JSON和XML...

    springMVC+json.zip_JSON_myeclipse_springmvc_数据传递

    - Controller方法接收参数,SpringMVC会自动将JSON数据转化为Java对象,通过`@RequestBody`注解注入到方法参数中。 - Controller处理业务逻辑后,可能需要返回JSON数据。通过`@ResponseBody`注解,SpringMVC会调用...

    SpringMVC加入json支持的jar

    2. **配置对象转换**:如果你需要自定义JSON序列化和反序列化的规则,可以通过`ObjectMapper`进行设置。例如,你可能想要忽略某些字段,或者自定义日期格式: ```java @Bean public ObjectMapper objectMapper() { ...

Global site tag (gtag.js) - Google Analytics