赞
踩
需要使用序列化必须实现Serializable类
序列化的作用就是用于传输(存储)
using对象直接用默认的,省事省事省事
- @JsonSerialize // 序列化
- @JsonDeserialize // 反序列化
- private List<List<LinkedHashMap<String, Object>>> s;
注:这里要注意,序列化的意思是:把Java对象转换为字节序列的过程称为对象的序列化(例如从Java传数据给MySQL的时候需要把对象转成JSON对象,让MySQL语言能够识别内容),反之叫反序列化。具体可以参考以下博客了解什么是序列化:Java中的实体类为什么要 implements Serializable?_实体类继承serializable-CSDN博客
如果是数据库那出来的是map类型,则使用这种:
JSON.parseArray(JSON.toJSONString(你的类型), MenuButtons.class);
JsonDeserialize注解是Jackson库提供的一种注解,用于指定反序列化时使用的自定义反序列化器。作为Jackson库的一部分,JsonDeserialize注解可以在Java对象和JSON数据之间进行转换。
JsonDeserialize注解一般用于反序列化时需要进行特殊处理的情况,比如将一个JSON中的String类型字段解析为Java对象。
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注解有很多属性可以使用,下面对其中一些常用的属性进行介绍。
使用using属性指定反序列化器的类。如果不指定,则默认使用Jackson库提供的反序列化器。
- @JsonDeserialize(using = CustomDeserializer.class)
- public class Person {
- private String name;
- private int age;
- //getters and setters
- }
使用contentUsing属性指定反序列化器的类,用于集合元素、Map键值对、数组元素等。
- @JsonDeserialize(contentUsing = CustomDeserializer.class)
- private List<Person> children;
使用keyUsing属性指定反序列化器的类,用于Map键的反序列化。
- @JsonDeserialize(keyUsing = CustomKeyDeserializer.class)
- private Map<Person, String> map;
使用as属性指定反序列化类型。常用的取值为PROPERTY和VALUE,分别表示将元素的key或value作为反序列化类型。
- @JsonDeserialize(as = MyEnum.class)
- public class Person {
- private Map<String, MyEnum> properties;
- //getters and setters
- }
在实际开发中,经常会遇到需要将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类进行反序列化。
有时候,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注解的作用,以及如何使用该注解来实现不同的反序列化需求。在实际开发中,使用该注解可以大大简化代码量,提高开发效率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。