使用注解JSON序列化

@JsonSerialize(using = ToStringSerializer.class)

将返回数据转成String序列化

@JsonFormat(pattern ="yyyy-MM-dd hh:mm",timezone="GMT+8")

将日期数据转换成特定格式

使用@JsonSerialize自定义注解接口

定义接口

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonLocalSerializable {

	String localizationKey();

} 

 实现序列化方法

public class BigDecimalSerializer extends StdSerializer implements ContextualSerializer {

	private String localizationKey;

	public BigDecimalSerializer(String key) {
		super(BigDecimal.class);
		this.localizationKey = key;
	}

	@Override
	public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
		BigDecimal resVal = value.setScale(Integer.valueOf(localizationKey), BigDecimal.ROUND_HALF_UP);
		jgen.writeString(resVal.toString());
	}

	@Override
	public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {

		String key = null;
		JsonLocalSerializable ann = null;
		if (property != null) {
			ann = property.getAnnotation(JsonLocalSerializable.class);
		}
		if (ann != null) {
			key = ann.localizationKey();
		}
		if (key== null){
			key = "2";
		}
		return new BigDecimalSerializer(key);
	}
}
使用示例
@JsonSerialize(using = BigDecimalSerializer.class)
@JsonLocalSerializable(localizationKey = "2")
private BigDecimal baseVal;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = BigDecimalSerializer.class)
public @interface JsonLocalSerializable {

	String localizationKey();

} 

使用示例 

@JsonLocalSerializable(localizationKey = "0")

使用@JSONField自定义注解

public class LongSerializeConfig {

    public static class Long2StringSerializer implements ObjectSerializer {
        @Override
        public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
                          int features) {
            if (!Long.class.equals(fieldType)) {
                log.warn("Field configuration error");
                serializer.write(object);
            }
            serializer.write(object.toString());
        }
    }

    public static class FloatStringSerializer implements ObjectSerializer {
        @Override
        public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
                          int features) {
            if (!Float.class.equals(fieldType)) {
                log.warn("Field configuration error");
                serializer.write(object);
            }
            String f = MathUtils.keepTwoDecimalFloat(object);
            serializer.write(f);
        }
    }

    public static class String2LongDeserializer implements ObjectDeserializer {
        @Override
        public  T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
            if (!Long.class.equals(type)) {
                log.warn("Field configuration error");
                return (T) parser.parse();
            }
            String value = (String) parser.parse();
            return value == null ? null : (T) Long.valueOf(value);
        }

        @Override
        public int getFastMatchToken() {
            return 0;
        }
    }
}
@JSONField(serializeUsing = BigDecimalSerializer.class)

@JSONField是做什么用的

@JSONField是fastjson的一个注解,在fastjson解析一个类为Json对象时,作用到类的每一个属性(field)上。

通过用@JSONField注解一个类的属性,我们可以达到以下目标

    指定field对应的key名称:@JSONField(name = “NaMe”)
    对于时间字段,指定其格式:@JSONField(format = “yyyy-MM-dd HH:mm:ss”)
    不序列化某些字段:@JSONField(serialize = false)
    指定顺序:@JSONField(ordinal = 1)
    当然,以上注解里的属性,可以同时使用:@JSONField(name = “nAmE”, format = “yyyy-MM-dd HH:mm”)

 

你可能感兴趣的:(常用工具,java,spring,jvm)