我是直接用默认的,省事省事省事
@JsonSerialize // 序列化@JsonDeserialize // 反序列化private List<List<LinkedHashMap<String, Object>>> s;
一、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> {@Overridepublic 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> {@Overridepublic 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> {@Overridepublic 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注解的作用,以及如何使用该注解来实现不同的反序列化需求。在实际开发中,使用该注解可以大大简化代码量,提高开发效率。
地址:详解JsonDeserialize注解_笔记大全_设计学院