成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

 [[435637]]

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

場景

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

Jackson中的Mixin

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

Mixin的實現(xiàn)

我們有一個User類,為了演示需要,我們極端一些,實際開發(fā)中不太會出現(xiàn)這種極端情況。這個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類

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

  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映射起來。并編寫一個序列化和反序列化的例子。

  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); 

這樣我們在不對目標(biāo)類進行任何改變的情況下實現(xiàn)了個性化的JSON序列化和反序列化。

Jackson中的Module

Jackson還提供了模塊化功能,可以將個性化配置進行模塊化統(tǒng)一管理,而且可以按需引用,甚至可插拔。它同樣能夠管理一組Mixin。聲明一個Jackson Module非常簡單,繼承SimpleModule覆寫它的一些方法即可。針對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同樣可以注冊到ObjectMapper中,同樣也能實現(xiàn)我們想要的效果:

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

Module的功能更加強大。平常我們會使用以下幾個Module:

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

2011-06-01 15:05:02

序列化反序列化

2022-08-06 08:41:18

序列化反序列化Hessian

2011-05-18 15:20:13

XML

2009-08-24 17:14:08

C#序列化

2009-08-06 11:16:25

C#序列化和反序列化

2009-07-29 13:39:02

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

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-06-14 22:01:27

Java對象序列化反序列化

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#序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2024-01-30 13:32:51

JSON反序列化序列化

2011-06-01 14:50:48

2010-03-19 15:54:21

Java Socket

2012-04-13 10:45:59

XML

2013-03-11 13:55:03

JavaJSON
點贊
收藏

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

主站蜘蛛池模板: 免费久久精品 | caoporn国产 | 久久免费精品视频 | 国产亚洲欧美在线 | 国产欧美日韩一区 | 亚洲精品电影网在线观看 | 亚洲精品一区国产精品 | 亚洲精品在线播放 | 国产美女一区 | 91成人免费电影 | 欧美三区 | 亚洲一区亚洲二区 | 亚洲自拍偷拍av | 婷婷五月色综合 | 日韩在线免费视频 | 美女黄网 | 午夜寂寞影院列表 | 91超碰caoporn97人人 | h在线免费观看 | 中文字字幕在线中文乱码范文 | 久久高清 | 国产 日韩 欧美 制服 另类 | 国产馆 | 啪啪综合网 | 在线观看日韩 | 91一区二区 | 亚洲激情综合网 | 久久久久久久综合色一本 | 可以免费观看的av片 | 激情av | 91久久精品一区 | 久久999 | 黄色一级在线播放 | 色悠悠久 | 欧美激情综合 | 黄篇网址 | 国产精品成人久久久久 | 一区二区成人 | 中文字幕第二十页 | 欧美一区二区三区久久精品 | 亚洲一区二区三区免费观看 |