`

Spring MVC Jackson 格式序列化

阅读更多

    一个上市公司竟然无法解决html尖角号的问题,我也是很无奈,自己实现了一个html过滤器。

    解决问题:修改@ResponseBody返回值。

    1.ExampleEntity类,首先定义模型,使用@JsonSerialize注解指定序列化类,@JsonIgnore注解序列化忽略,@JsonFormat注解格式化时间格式。

package com.jc.bus.example.entity;

import java.util.Date;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.jc.bus.example.serializer.ExampleSerializer;


@JsonSerialize(using = ExampleSerializer.class)
public class ExampleEntity {

	private String username;
	
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
	private Date date;

	@JsonIgnore
	private int age;
	
	private Double money;
	
	private List<String> ls;
	
	public Double getMoney() {
		return money;
	}

	public void setMoney(Double money) {
		this.money = money;
	}

	public List<String> getLs() {
		return ls;
	}

	public void setLs(List<String> ls) {
		this.ls = ls;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}
}

 

    2.ExampleSerializer序列化主类,也就是实体类注解指定序列化实现类,继承了JsonSerializer接口,实现其方法既可以。

package com.jc.bus.example.serializer;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.jc.bus.example.entity.ExampleEntity;
import com.jc.spring.extend.JacksonSerializerUtil;


public class ExampleSerializer extends JsonSerializer<ExampleEntity> {

	@Override
	public void serialize(ExampleEntity value, JsonGenerator gen,
			SerializerProvider serializers) throws IOException,
			JsonProcessingException {
		// TODO Auto-generated method stub
		gen.writeStartObject();
		JacksonSerializerUtil.writeParm(gen, value);
		gen.writeEndObject();
	}
	
}

     3.JacksonSerializerUtil工具类,这里我本想实现一个通用模型,但是最后并没有写完,这里实现了基本类型的通用方法,已经满足日常的需求了。

package com.jc.spring.extend;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import com.fasterxml.jackson.core.JsonGenerator;

public class JacksonSerializerUtil {
	//com.fasterxml.jackson.annotation.JsonIgnore;
	/**
	 * Jackson序列话参数写入标准实现
	 * @param gen
	 * @param value
	 */
	public static void writeParm(JsonGenerator gen, Object value){
		Class<? extends Object> classTemp = value.getClass();
		Field[] fields = classTemp.getDeclaredFields();
		try {
			for (int i=0; i<fields.length; i++){
				Field field = fields[i];
				field.setAccessible(true);
				if(field.isAnnotationPresent(com.fasterxml.jackson.annotation.JsonIgnore.class)){
					continue;
				}
				//字段类型
				Class<?> type = field.getType();
				String fieldName = field.getName();
				PropertyDescriptor pd=new PropertyDescriptor(fieldName,classTemp);
				Method method = pd.getReadMethod();
				Object obj = method.invoke(value);
				//判断是否是null,给出默认值
				boolean flag = obj==null;
				
				if (flag){
					gen.writeStringField(fieldName, "");
					continue;
				}
				
				if (type == String.class){
					gen.writeStringField(fieldName, HtmlFilter.doHtmlFilter((String)obj));
				}else if (type==Long.class){
					gen.writeNumberField(fieldName, (Long)obj);
				}else if (type==Integer.class){
					gen.writeNumberField(fieldName, (Integer)obj);
				}else if (type==Short.class){
					gen.writeNumberField(fieldName, (Short)obj);
				}else if (type==Float.class){
					gen.writeNumberField(fieldName, (Float)obj);
				}else if (type==Double.class){
					gen.writeNumberField(fieldName, (Double)obj);
				}else if (type==BigDecimal.class){
					gen.writeNumberField(fieldName, (BigDecimal)obj);
				}else if (type==byte[].class){
					gen.writeBinaryField(fieldName, (byte[])obj);
				}else if (type==Date.class){
					if (field.isAnnotationPresent(com.fasterxml.jackson.annotation.JsonFormat.class)){
						com.fasterxml.jackson.annotation.JsonFormat jf = field.getAnnotation(com.fasterxml.jackson.annotation.JsonFormat.class);
						String pattern = jf.pattern();
						DateFormat df = new SimpleDateFormat(pattern);
						gen.writeStringField(fieldName, df.format((Date)obj));
					}else{
						DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
						gen.writeStringField(fieldName, df.format((Date)obj));
					}
				}else if (type==List.class){
					gen.writeArrayFieldStart(fieldName);
					List list = (List)obj;
					for (Object element : list){
						writeBaseType(gen, element);
					}
					gen.writeEndArray();
				}
				
			}
				
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void writeBaseType(JsonGenerator gen, Object field){
		try {
			boolean flag = field==null;
			//字段类型
			if (flag){
				return ;
			}
			if (field instanceof String){
				gen.writeString(HtmlFilter.doHtmlFilter((String)field));
			}else if (field instanceof Long){
				gen.writeNumber((Long)field);
			}else if (field instanceof Integer){
				gen.writeNumber((Integer)field);
			}else if (field instanceof Short){
				gen.writeNumber((Short)field);
			}else if (field instanceof Float){
				gen.writeNumber((Float)field);
			}else if (field instanceof Double){
				gen.writeNumber((Double)field);
			}else if (field instanceof BigDecimal){
				gen.writeNumber((BigDecimal)field);
			}else if (field instanceof byte[]){
				gen.writeBinary((byte[])field);
			}else if (field instanceof Date){
				DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				gen.writeString(df.format((Date)field));
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

 4.HtmlFilter转换工具类,修改html特殊字符。

package com.jc.spring.extend;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.aspectj.lang.annotation.Aspect;

@Aspect
public class HtmlFilter {
	
	private static Map<Character, String> filterMap = new HashMap<Character, String>();
	static {
		filterMap.put('\"', "&quot;");
		filterMap.put('&', "&amp;");
		filterMap.put('<', "&lt;");
		filterMap.put('>', "&gt;");
		filterMap.put('\'', "&apos;");
		filterMap.put('\\', "&#92;");
	}
	
	/**
	 * 在get*方法体里调用,自动转换字符
	 * @param parm
	 * @return
	 */
	public static String doHtmlFilter (String parm){
		//最终返回参数
		StringBuilder reString = new StringBuilder("");
		
		char[] chars = parm.toCharArray();
		
		for (int i=0; i<chars.length; i++){
			Character c = chars[i];
			Set<Entry<Character, String>> entry = filterMap.entrySet();
			boolean bflag = true;
			for (Entry<Character, String> filterEntry : entry){
				Character convertChar = filterEntry.getKey();
				if (c.equals(convertChar)){
					reString.append(filterEntry.getValue());
					bflag = false;
					break;
				}
			}
			if (bflag){
				reString.append(c);
			}
		}
		return reString.toString();
	}
	
}

 5.这里需要注意一定要把jackson注入。

    @Bean
    public JacksonAnnotationIntrospector jacksonAnnotationIntrospector() {
        return new JacksonAnnotationIntrospector();
    }
    
    @Bean(name = "objectMapper")
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        mapper.configure(SerializationFeature.INDENT_OUTPUT, false);
        
        mapper.setAnnotationIntrospector(jacksonAnnotationIntrospector());
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        return mapper;
    }

 

分享到:
评论

相关推荐

    spring mvc json&&jackson jquery js

    Jackson是Java中广泛使用的JSON库,它可以高效地处理JSON序列化和反序列化。在Spring MVC中,Jackson是默认的JSON处理器,通过`ObjectMapper`类进行数据转换。Spring MVC还提供了`@JsonView`注解来控制JSON响应中的...

    Spring MVC所需jar包

    7. **Jackson 或 Gson**:用于 JSON 数据的序列化和反序列化,例如 `jackson-databind.jar`、`jackson-core.jar` 和 `jackson-annotations.jar`,或者 `gson.jar`。 8. **Dojo 或 jQuery**:如果在前端使用 ...

    spring mvc restful service

    - **JSON**:Spring MVC使用Jackson库来序列化和反序列化JSON数据。`@RequestBody`用于将请求体中的JSON数据转换为Java对象,而`@ResponseBody`则将方法的返回值转换为JSON发送回客户端。 - **XML**:对于XML,...

    Spring MVC 学习笔记 九 json格式的输入和输出

    如果需要自定义JSON序列化的行为,例如忽略某些字段或使用特定的日期格式,可以使用Jackson的`@JsonInclude`、`@JsonFormat`等注解。还可以创建自定义的`JsonSerializer`和`JsonDeserializer`实现特定逻辑。 6. **...

    spring mvc集成webservice

    1. **添加依赖**:在项目中引入Spring的Web服务模块(如`spring-ws-core`),以及可能需要的其他依赖,如`jackson-databind`用于JSON序列化。 2. **创建WSDL**:定义Web服务的接口,这通常是一个WSDL(Web Service ...

    helloworld spring mvc

    Spring MVC项目会依赖Spring Framework的相应模块,以及其他如Jackson、Thymeleaf等库,以实现JSON序列化、模板引擎等功能。 6. **Lib**或**lib**目录(如果使用非构建工具管理依赖):这里包含项目所需的JAR库,如...

    spring使用jackson实现json

    四、使用Jackson序列化与反序列化 1. 序列化:将Java对象转换为JSON ```java import com.fasterxml.jackson.databind.ObjectMapper; // 创建一个对象 MyObject obj = new MyObject(); // 使用ObjectMapper将其转换...

    Spring MVC框架的各种依赖包下载

    7. **Jackson或Gson**:用于JSON数据的序列化和反序列化,Spring MVC默认支持这两种库,便于前后端数据交换。 8. **Hibernate或MyBatis**:如果应用需要持久化数据,这些ORM(对象关系映射)框架可以与Spring MVC...

    spring mvc架包

    9. **JSON 支持**: 通过集成 Jackson 或者 Gson,Spring MVC 可以方便地进行 JSON 数据的序列化和反序列化,用于 RESTful API 的开发。 10. **上传下载支持**: Spring MVC 提供了文件上传和下载的功能,通过 `...

    基于注解Spring MVC环境搭建

    创建Spring MVC项目时,需要在`pom.xml`文件中添加Spring MVC、Spring核心以及其他依赖,如Spring Web和Jackson库(用于JSON序列化和反序列化)。 10. **IDE集成** 使用Eclipse、IntelliJ IDEA等IDE,可以快速...

    spring mvc(整合了json)

    在 Model 类中,我们可以使用这些注解来定制序列化和反序列化的行为。 4. **控制器方法的编写**:在 Spring MVC 的控制器类中,我们可以定义处理 HTTP 请求的方法,并使用 `@RequestBody` 和 `@ResponseBody` 注解...

    Spring MVC REST Demo

    此外,为了提供JSON格式的数据交换,你可能还需要使用如Jackson或Gson这样的库进行序列化和反序列化。 总结来说,"Spring MVC REST Demo"项目展示了如何在Spring MVC框架中利用REST原则创建Web服务。这包括定义...

    Spring MVC 数据转换和格式化.docx

    这些转换器允许我们将Java对象序列化成适合HTTP传输的格式,如JSON或XML,同时也能够将接收到的HTTP请求数据反序列化回Java对象。 `MappingJackson2HttpMessageConverter`是Spring MVC中用于处理JSON数据的典型转换...

    spring mvc框架需要用到的jar包

    11. **jackson或者gson.jar**:JSON序列化和反序列化的库,Spring MVC通常使用它们将Java对象转换为JSON格式,以便于前后端的数据交换。 12. **validation-api.jar** 和 **hibernate-validator.jar**:用于执行Bean...

    Spring mvc工程所需jar包资源

    15. **json处理库**:如Jackson或Gson,用于JSON序列化和反序列化,便于前后端数据交换。 在构建Spring MVC项目时,这些jar包需要添加到项目的类路径中,以确保所有依赖能够正确解析并运行。通常,现代的构建工具如...

    spring MVC 对 ResponseBody返回json数据进行脱敏处理

    默认情况下,Spring MVC使用`HttpMessageConverter`来完成这个转换,其中最常用的转换器是`MappingJackson2HttpMessageConverter`,它依赖于Jackson库来序列化对象为JSON。 接下来,我们将探讨如何实现JSON数据的...

    spring-MVC整合jar包

    10. **其他依赖**: 包括 Servlet API、JSTL、Commons Logging、Jackson/JSON-P/JSON-B 等,用于完成 HTTP 交互、日志记录、JSON 序列化等任务。 在"spring-MVC整合jar包"中,包含了以上所述的关键组件和它们的依赖...

    spring-framework-4.3.8,Springmvc框架需要的jar包及相匹配jackson包,

    与之配套的是Jackson库,这是一款高效的JSON处理库,常用于Spring MVC应用中进行数据序列化和反序列化。 在使用Spring Framework 4.3.8时,确保你的Java Development Kit (JDK)版本至少是1.8。这是由于Spring框架4....

    解决spring mvc JSON 无限死循环

    当我们在Spring MVC应用中尝试将包含循环引用的对象序列化为JSON时,Jackson(默认的JSON处理库)会尝试无限次地深入对象图进行序列化,最终导致堆栈溢出错误(StackOverflowError)。例如,在上述部分日志中,`Album`...

    SpringMVC jar包合集

    - Jackson 或 Gson jar 包用于 JSON 数据的序列化和反序列化,这对于现代 Web API 开发至关重要。 10. **测试支持**: - spring-test 和 mockito 等库用于编写单元测试和集成测试,确保 Spring MVC 应用的功能...

Global site tag (gtag.js) - Google Analytics