需要使用序列化必须实现Serializable类
序列化的作用就是用于传输(存储)
using对象直接用默认的,省事省事省事
@JsonSerialize // 序列化
@JsonDeserialize // 反序列化
private List<List<LinkedHashMap<String, Object>>> s;
注:这里要注意,序列化的意思是:把Java对象转换为字节序列的过程称为对象的序列化(例如从Java传数据给MySQL的时候需要把对象转成JSON对象,让MySQL语言能够识别内容),反之叫反序列化。具体可以参考以下博客了解什么是序列化:Java中的实体类为什么要 implements Serializable?_实体类继承serializable-优快云博客
如果是数据库那出来的是map类型,则使用这种:
JSON.parseArray(JSON.toJSONString(你的类型), MenuButtons.class);
一、JsonDeserialize注解介绍
JsonDeserialize注解是Jackson库提供的一种注解,用于指定反序列化时使用的自定义反序列化器。作为Jackson库的一部分,JsonDeserialize注解可以在Java对象和JSON数据之间进行转换。
JsonDeserialize注解一般用于反序列化时需要进行特殊处理的情况,比如将一个JSON中的String类型字段解析为Java对象。
二、JsonDeserialize注解使用示例
JsonDeserialize注解可以用于字段、setter方法或构造函数。
public class Person {
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date birthDate;
}
public class CustomDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String date = jp.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
上面的代码中,使用了JsonDeserialize注解来指定birthDate字段在反序列化时使用CustomDateDeserializer类进行处理。
三、JsonDeserialize注解的属性
JsonDeserialize注解有很多属性可以使用,下面对其中一些常用的属性进行介绍。
1. using
使用using属性指定反序列化器的类。如果不指定,则默认使用Jackson库提供的反序列化器。
@JsonDeserialize(using = CustomDeserializer.class)
public class Person {
private String name;
private int age;
//getters and setters
}
2. contentUsing
使用contentUsing属性指定反序列化器的类,用于集合元素、Map键值对、数组元素等。
@JsonDeserialize(contentUsing = CustomDeserializer.class)
private List<Person> children;
3. keyUsing
使用keyUsing属性指定反序列化器的类,用于Map键的反序列化。
@JsonDeserialize(keyUsing = CustomKeyDeserializer.class)
private Map<Person, String> map;
4. as
使用as属性指定反序列化类型。常用的取值为PROPERTY和VALUE,分别表示将元素的key或value作为反序列化类型。
@JsonDeserialize(as = MyEnum.class)
public class Person {
private Map<String, MyEnum> properties;
//getters and setters
}
四、JsonDeserialize注解的实践应用场景
1. Map转String
在实际开发中,经常会遇到需要将Map对象转换为String类型的情况。使用JsonDeserialize注解可以方便地实现这一功能。
public class MyObject {
@JsonDeserialize(using = MapToStringDeserializer.class)
private Map<String, String> data;
}
public class MapToStringDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
Map<String, String> map = p.readValueAs(Map.class);
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
if (sb.length() > 0) {
sb.append("&");
}
sb.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
sb.append("=");
sb.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}
return sb.toString();
}
}
上面的代码中,定义了一个MyObject类,其中的data字段使用了MapToStringDeserializer类进行反序列化。
2. 处理特殊字段类型
有时候,JSON中的字段类型与Java对象中的类型不完全一致,这时就需要使用JsonDeserialize注解进行特殊处理。
public class Product {
private String id;
@JsonDeserialize(using = MonetaryAmountDeserializer.class)
private MonetaryAmount price;
//getters and setters
}
public class MonetaryAmount {
private String currency;
private BigDecimal value;
//getters and setters
}
public class MonetaryAmountDeserializer extends JsonDeserializer<MonetaryAmount> {
@Override
public MonetaryAmount deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
ObjectCodec codec = p.getCodec();
JsonNode node = codec.readTree(p);
String currency = node.get("currency").asText();
BigDecimal value = node.get("value").decimalValue();
return new MonetaryAmount(currency, value);
}
}
上面的代码中,定义了一个Product类,其中的price字段类型为MonetaryAmount,在反序列化时,使用了MonetaryAmountDeserializer类进行处理。
五、总结
通过本文的介绍,我们可以了解到JsonDeserialize注解的作用,以及如何使用该注解来实现不同的反序列化需求。在实际开发中,使用该注解可以大大简化代码量,提高开发效率。