使用注解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<BigDecimal> implements ContextualSerializer {private String localizationKey;public BigDecimalSerializer(String key) {super(BigDecimal.class);this.localizationKey = key;}@Overridepublic 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());}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic <T> 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);}@Overridepublic 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”)