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 注解来实现指定日期格式特定输出。

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

      

  • 相关阅读:
    ABAP 程序中的类 沧海
    ABAP类的方法(转载) 沧海
    More than 100 ABAP Interview Faq's(2) 沧海
    SAP and ABAP Memory总结 沧海
    ABAP Frequently Asked Question 沧海
    ABAP System Reports(Additional functions) 沧海
    ABAP Questions Commonly Asked 1 沧海
    ABAP Tips and Tricks 沧海
    ABAP System Fields 沧海
    ABAP 面试问题及答案(一):数据库更新及更改 SAP Standard (转) 沧海
  • 原文地址:https://www.cnblogs.com/laobiao/p/7082846.html
Copyright © 2011-2022 走看看