使用注解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;
	}

	@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> 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”)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中的 JSON 序列化和反序列化可以使用许多第三方库来实现,比如 Jackson、Gson、FastJson 等。这里以 Jackson 库为例,介绍如何进行 JSON 序列化和反序列化。 ### Jackson 序列化 Jackson 序列化可以将 Java 对象转换为 JSON 字符串。示例代码如下: ```java ObjectMapper objectMapper = new ObjectMapper(); MyObject myObject = new MyObject(); // 要序列化Java 对象 String json = objectMapper.writeValueAsString(myObject); // 序列化JSON 字符串 ``` 在上面的代码中,ObjectMapper 是 Jackson 序列化和反序列化的核心类。writeValueAsString() 方法将 Java 对象序列化JSON 字符串。 如果要对序列化后的 JSON 字符串进行格式化,可以使用 ObjectMapper 的 writerWithDefaultPrettyPrinter() 方法: ```java ObjectMapper objectMapper = new ObjectMapper(); MyObject myObject = new MyObject(); // 要序列化Java 对象 String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(myObject); // 序列化成格式化后的 JSON 字符串 ``` ### Jackson 反序列化 Jackson 反序列化可以将 JSON 字符串转换为 Java 对象。示例代码如下: ```java ObjectMapper objectMapper = new ObjectMapper(); String json = "{\"name\":\"Tom\", \"age\":20}"; // 要反序列化JSON 字符串 MyObject myObject = objectMapper.readValue(json, MyObject.class); // 反序列化Java 对象 ``` 在上面的代码中,readValue() 方法将 JSON 字符串反序列化Java 对象。第一个参数是要反序列化JSON 字符串,第二个参数是目标 Java 类型。 ### Jackson 注解 Jackson 序列化和反序列化还支持一些注解,用于控制序列化和反序列化的行为。比如,可以使用 @JsonProperty 注解指定 JSON 字段名: ```java public class MyObject { @JsonProperty("user_name") private String name; private int age; // ... } ``` 在上面的代码中,@JsonProperty("user_name") 注解指定了 JSON 字段名为 "user_name",而不是默认的 "name"。这样,在序列化和反序列化时,Jackson 就会使用指定的字段名。 除了 @JsonProperty 注解,Jackson 还支持许多其他注解,比如 @JsonIgnore、@JsonFormat、@JsonInclude 等。这些注解可以用于控制序列化和反序列化的行为,更多的注解用法可以参考 Jackson 的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值