zoukankan      html  css  js  c++  java
  • 【巨坑】springmvc 输出json格式数据的几种方式!

    最近公司项目需要发布一些数据服务,从设计到实现两天就弄完了,心中窃喜之。 结果临近部署时突然发现。。。。。  服务输出的JSON 数据中  date 类型数据输出格式要么是时间戳,要么是  {"date":26,"day":1,"hours":21,"minutes":38,"month":5,"seconds":22,"time":1498484302259,"timezoneOffset":-480,"year":117}  这种格式。 妹的,急死我也! 感谢百度,感谢各位前辈解我之急,在家苦干三小时总结出几种date类数据格式转换的方法;

    前提:需要架包 jackson-annotations-2.7.4.jar ,jackson-core-2.7.4.jar, jackson-databind-2.7.4.jar

    第一种:直接上配置 在springmvc 的配置文件中 注解配置改为:

    <mvc:annotation-driven>
    		<mvc:message-converters>
    			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
    				<property name="supportedMediaTypes">
    					<list>
    						<value>application/json;charset=UTF-8</value>
    					</list>
    				</property>
    			</bean>
    			<!-- Json 转换配置 -->
    			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    				<property name="objectMapper">  
                                          <bean class="com.fasterxml.jackson.databind.ObjectMapper">  
                                               <property name="dateFormat">  
                                                   <bean class="java.text.SimpleDateFormat">  
                                                     <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />  
                                                   </bean>  
                                               </property>  
                                          </bean>  
                                    </property>  
    				
    				
    				<property name="supportedMediaTypes">
    					<list>
    						<value>text/plain;charset=utf-8</value>
    	                	                 <value>text/html;charset=utf-8</value>
    	                	                <value>text/json;charset=utf-8</value>
    	                	                <value>application/json;charset=utf-8</value>
    					</list>
    				</property>
    			</bean>
    		</mvc:message-converters>
    	</mvc:annotation-driven>
    

     这种方法简单。。太简单了。无需其他配置,全局有效。

    第二种  针对需独立转换的数据(部分转换)

    以上配置可以不用了,需要自定义json序列化日期数据的实现方式

    //内容不多,主要为了指定转换方式
    import
    java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; public class CustomDateSerializer extends JsonSerializer<Date> { @Override public void serialize(Date arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //转换格式 arg1.writeString(sdf.format(arg0)); //写入转换后的值 } }

    好了,写好了。现在我们只需在需要转换的date字段上添加 注解 @JsonSerialize 即可:

    @JsonSerialize(using = CustomDateSerializer.class)  //使用注解 @JsonFormat(pattern="yyyy/MM/dd HH:mm:ss",timezone = "GMT+8") 也可以
        private Date time2;

    再没有其他操作了。

    第三种:也是针对全局转换的方式,需要些一个工具类(仔细观察和第二种很多相似的地方)

    /*
    +--------------------------------------------------------------------------
    |   Mblog [#RELEASE_VERSION#]
    |   ========================================
    |   Copyright (c) 2014, 2015 mtons. All Rights Reserved
    |   http://www.mtons.com
    |
    +---------------------------------------------------------------------------
    */
    package com.dm.restWeb.config;
    
    import java.io.IOException;
    import java.lang.reflect.AnnotatedElement;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.springframework.format.annotation.DateTimeFormat;
    import org.springframework.stereotype.Component;
    
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.introspect.Annotated;
    import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
    import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
    
    /**
     * @author langhsu
     * 
     */
    @Component
    public class JsonUtils {
        private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
        private static final ObjectMapper mapper;
    
        public ObjectMapper getMapper() {
            return mapper;
        }
    
        static {
            SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
    
            mapper = new ObjectMapper();
            mapper.setDateFormat(dateFormat);
            mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
                private static final long serialVersionUID = -5854941510519564900L;
    
                @Override
                public Object findSerializer(Annotated a) {
                    if (a instanceof AnnotatedMethod) {
                        AnnotatedElement m = a.getAnnotated();
                        DateTimeFormat an = m.getAnnotation(DateTimeFormat.class);
                        if (an != null) {
                            if (!DEFAULT_DATE_FORMAT.equals(an.pattern())) {
                                return new JsonDateSerializer(an.pattern());
                            }
                        }
                    }
                    return super.findSerializer(a);
                }
            });
        }
    
        public static String toJson(Object obj) {
            try {
                return mapper.writeValueAsString(obj);
            } catch (Exception e) {
                throw new RuntimeException("转换json字符失败!");
            }
        }
    
        public <T> T toObject(String json, Class<T> clazz) {
            try {
                return mapper.readValue(json, clazz);
            } catch (IOException e) {
                throw new RuntimeException("将json字符转换为对象时失败!");
            }
        }
    
        public static class JsonDateSerializer extends JsonSerializer<Date> {
            private SimpleDateFormat dateFormat;
    
            public JsonDateSerializer(String format) {
                dateFormat = new SimpleDateFormat(format);
            }
    
            @Override
            public void serialize(Date date, JsonGenerator gen,
                    SerializerProvider provider) throws IOException,
                    JsonProcessingException {
                String value = dateFormat.format(date);
                gen.writeString(value);
            }
        }
    }

    其实就是用静态方法来实现获取 ObjectMapper 对象;

    还需要在springmvc 配置文件中写入配置:

    <mvc:annotation-driven>
            <mvc:message-converters>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
                <!-- Json -->
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="objectMapper" value="#{jsonUtils.mapper}"/> <!-- 和第一种方法配置模式一样 -->
                   
                    
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/plain;charset=utf-8</value>
                            <value>text/html;charset=utf-8</value>
                            <value>text/json;charset=utf-8</value>
                            <value>application/json;charset=utf-8</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>

     你会发现第三种方法和第一种方法是差不多的 , 但是第三种方法支持 使用 @JsonFormat 注解来实现指定日期格式特定输出。

    所以从代码实现看来  第三种方式功能最全面,第一种方式配置最简便 ,第二种配置方式不推荐。

      

  • 相关阅读:
    dedecms文章标题是在哪个数据库表?要批量替换关键词
    dedecms首页调用的简介一直修改不了是自动文章摘要在作怪
    如何进行微信营销?玩转微信公众平台营销理论手册
    用了那么久居然没发现firefox快捷键有如此多
    保护隐私:清除cookie、禁用cookie确保安全【分享给身边的朋友吧】
    如何更改firefox默认搜索引擎?一步搞定!
    微信红包中使用的技术:AA收款+随机算法
    马年添加一下马蹄印记统计(网站统计)
    今天上完就放假了,马年见
    三种dedecms调用相关文章的方法
  • 原文地址:https://www.cnblogs.com/laobiao/p/7082846.html
Copyright © 2011-2022 走看看