将返回数据转成String序列化
将日期数据转换成特定格式
定义接口
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")
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是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”)