自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Json序列化和反序列化還有這種玩法

開發(fā) 前端
Mixin對(duì)于前端開發(fā)者可不陌生,Vue、React等知名前端框架都使用了Mixin。而對(duì)于后端開發(fā),尤其是Java后端開發(fā)來說Mixin卻是一個(gè)很陌生的概念。今天來我們通過Jackson讓后端開發(fā)者也來認(rèn)識(shí)一下Mixin。

 [[435637]]

Mixin對(duì)于前端開發(fā)者可不陌生,Vue、React等知名前端框架都使用了Mixin。而對(duì)于后端開發(fā),尤其是Java后端開發(fā)來說Mixin卻是一個(gè)很陌生的概念。今天來我們通過Jackson讓后端開發(fā)者也來認(rèn)識(shí)一下Mixin。

場(chǎng)景

比如我們引用了一個(gè)Jar包,其中的某個(gè)類在某個(gè)場(chǎng)景需要反序列化,但是這個(gè)類沒有提供默認(rèn)構(gòu)造。咋辦呢?把原來的項(xiàng)目拉下來,重寫一下?下下策! 你可以使用Jackson提供的Mixin特性來解決這個(gè)問題。

Jackson中的Mixin

Jackson中的Mixin(混入)我們可以這樣解讀它:將目標(biāo)對(duì)象無法實(shí)現(xiàn)的序列化或反序列化功能通過一個(gè)混入對(duì)象進(jìn)行配置,在序列化或反序列化的時(shí)候把這些個(gè)性化配置混入到目標(biāo)對(duì)象中。混入不改變目標(biāo)對(duì)象本身的任何特性,混入對(duì)象和目標(biāo)對(duì)象是映射的關(guān)系。接下來我們來實(shí)現(xiàn)一個(gè)混入的DEMO。

Mixin的實(shí)現(xiàn)

我們有一個(gè)User類,為了演示需要,我們極端一些,實(shí)際開發(fā)中不太會(huì)出現(xiàn)這種極端情況。這個(gè)User沒有無參構(gòu)造,也沒有屬性的getter方法。

  1. public class User { 
  2.     private final String name
  3.     private final Integer age; 
  4.  
  5.     public User(String nameInteger age) { 
  6.         this.name = name
  7.         this.age = age; 
  8.     } 
  9.     @Override 
  10.     public String toString() { 
  11.         return "User{" + 
  12.                 "name='" + name + '\'' + 
  13.                 ", age=" + age + 
  14.                 '}'
  15.     } 

編寫Mixin類

我想對(duì)這個(gè)極端的User進(jìn)行序列化和反序列化。按以前的玩法我們?cè)赨ser類上加上@JsonAutoDetect注解就可以實(shí)現(xiàn)序列化了;加上@JsonDeserialize注解并指定反序列化類就可以反序列化了。不過今天我們不需要對(duì)User進(jìn)行任何更改,只需要編寫一個(gè)Mixin類把上述兩個(gè)注解配置好就可以了。

  1. @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, 
  2.         isGetterVisibility = JsonAutoDetect.Visibility.NONE) 
  3. @JsonIgnoreProperties(ignoreUnknown = true
  4. @JsonDeserialize(using = UserMixin.UserDeserializer.class) 
  5. public abstract class UserMixin { 
  6.  
  7.     /** 
  8.      * 反序列化類 
  9.      **/ 
  10.     static class UserDeserializer extends JsonDeserializer<User> { 
  11.  
  12.         @Override 
  13.         public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { 
  14.             ObjectMapper mapper = (ObjectMapper) p.getCodec(); 
  15.             JsonNode jsonNode = mapper.readTree(p); 
  16.  
  17.             String name = readJsonNode(jsonNode, "name").asText(null); 
  18.             String age = readJsonNode(jsonNode, "age").asText(null); 
  19.             Integer ageVal = Objects.isNull(age)? nullInteger.valueOf(age); 
  20.             return new User(name,ageVal); 
  21.         } 
  22.  
  23.         private JsonNode readJsonNode(JsonNode jsonNode, String field) { 
  24.             return jsonNode.has(field) ? jsonNode.get(field) : MissingNode.getInstance(); 
  25.         } 
  26.     } 
  27.  

其它注解可以參考往期的Jackson文章的介紹

Mixin映射目標(biāo)類

編寫完Mixin類后,我們通過ObjectMapper中的addMixIn方法把UserMixin和User映射起來。并編寫一個(gè)序列化和反序列化的例子。

  1. ObjectMapper objectMapper = new ObjectMapper(); 
  2.    objectMapper.addMixIn(User.class, UserMixin.class); 
  3.  
  4.    User felord = new User("felord", 12); 
  5.    String json = objectMapper.writeValueAsString(felord); 
  6.    //{"name":"felord","age":12}  
  7.    System.out.println("json = " + json); 
  8.  
  9.    String jsonStr = "{\"name\":\"felord\",\"age\":12}"
  10.  
  11.    User user = objectMapper.readValue(jsonStr, User.class); 
  12.    // User{name='felord', age=12} 
  13.    System.out.println("user = " + user); 

這樣我們?cè)诓粚?duì)目標(biāo)類進(jìn)行任何改變的情況下實(shí)現(xiàn)了個(gè)性化的JSON序列化和反序列化。

Jackson中的Module

Jackson還提供了模塊化功能,可以將個(gè)性化配置進(jìn)行模塊化統(tǒng)一管理,而且可以按需引用,甚至可插拔。它同樣能夠管理一組Mixin。聲明一個(gè)Jackson Module非常簡(jiǎn)單,繼承SimpleModule覆寫它的一些方法即可。針對(duì)Mixin我們可以這樣寫:

  1. public class UserModule extends SimpleModule { 
  2.    public UserModule() { 
  3.        super(UserModule.class.getName()); 
  4.    } 
  5.  
  6.    @Override 
  7.    public void setupModule(SetupContext context) { 
  8.         context.setMixInAnnotations(User.class,UserMixin.class); 
  9.    } 

Module同樣可以注冊(cè)到ObjectMapper中,同樣也能實(shí)現(xiàn)我們想要的效果:

  1. ObjectMapper objectMapper = new ObjectMapper(); 
  2.    objectMapper.registerModule(new UserModule()); 
  3.    // 省略 

Module的功能更加強(qiáng)大。平常我們會(huì)使用以下幾個(gè)Module:

  • jackson-module-parameter-names 此模塊能夠訪問構(gòu)造函數(shù)和方法參數(shù)的名稱
  • jackson-datatype-jdk8 除了Java8的時(shí)間API外其它新特性的的支持
  • jackson-datatype-jsr310 用以支持Java8新增的JSR310時(shí)間API

另外Spring Security也提供了Module支持SecurityJackson2Modules,它包含了下面的一些模塊:

  1. ObjectMapper mapper = new ObjectMapper(); 
  2. mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); 
  3. mapper.registerModule(new CoreJackson2Module()); 
  4. mapper.registerModule(new CasJackson2Module()); 
  5. mapper.registerModule(new WebJackson2Module()); 
  6. mapper.registerModule(new WebServletJackson2Module()); 
  7. mapper.registerModule(new WebServerJackson2Module()); 
  8. mapper.registerModule(new OAuth2ClientJackson2Module()); 

建議看一下SecurityJackson2Modules源碼,研究并模仿一下Module的使用。

 

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2022-08-06 08:41:18

序列化反序列化Hessian

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2011-05-18 15:20:13

XML

2009-08-06 11:16:25

C#序列化和反序列化

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2009-06-14 22:01:27

Java對(duì)象序列化反序列化

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2023-12-13 13:49:52

Python序列化模塊

2018-03-19 10:20:23

Java序列化反序列化

2009-09-09 16:10:11

.NET序列化和反序列

2009-08-25 14:43:26

C#序列化和反序列化

2024-01-30 13:32:51

JSON反序列化序列化

2011-06-01 14:50:48

2009-09-09 14:45:41

XML序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2010-03-19 15:54:21

Java Socket

2012-04-13 10:45:59

XML

2013-03-11 13:55:03

JavaJSON
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)