精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Jackson之 Java JSON 解析器

開發 前端
在當今的編程世界里,JSON 已經成為將信息從客戶端傳輸到服務器端的首選協議,可以好不夸張的說,XML 就是那個被拍死在沙灘上的前浪。

 

在當今的編程世界里,JSON 已經成為將信息從客戶端傳輸到服務器端的首選協議,可以好不夸張的說,XML 就是那個被拍死在沙灘上的前浪。

很不幸的是,JDK 沒有 JSON 庫,不知道為什么不搞一下。Log4j 的時候,為了競爭,還推出了 java.util.logging,雖然最后也沒多少人用。

Java 之所以牛逼,很大的功勞在于它的生態非常完備,JDK 沒有 JSON 庫,第三方類庫有啊,還挺不錯,比如說本篇的豬腳——Jackson,GitHub 上標星 6.1k,Spring Boot 的默認 JSON 解析器。

怎么證明這一點呢?

當我們通過 starter 新建一個 Spring Boot 的 Web 項目后,就可以在 Maven 的依賴項中看到 Jackson 的身影。

Jackson 有很多優點:

  • 解析大文件的速度比較快;
  • 運行時占用的內存比較少,性能更佳;
  • API 很靈活,容易進行擴展和定制。

Jackson 的核心模塊由三部分組成:

  • jackson-core,核心包,提供基于“流模式”解析的相關 API,包括 JsonPaser 和 JsonGenerator。
  • jackson-annotations,注解包,提供標準的注解功能;
  • jackson-databind ,數據綁定包,提供基于“對象綁定”解析的相關 API ( ObjectMapper ) 和基于“樹模型”解析的相關 API (JsonNode)。

01、引入 Jackson 依賴

要想使用 Jackson,需要在 pom.xml 文件中添加 Jackson 的依賴。

  1. <dependency> 
  2.     <groupId>com.fasterxml.jackson.core</groupId> 
  3.     <artifactId>jackson-databind</artifactId> 
  4.     <version>2.10.1</version> 
  5. </dependency> 

jackson-databind 依賴于 jackson-core 和 jackson-annotations,所以添加完 jackson-databind 之后,Maven 會自動將 jackson-core 和 jackson-annotations 引入到項目當中。

Maven 之所以討人喜歡的一點就在這,能偷偷摸摸地幫我們把該做的做了。

02、使用 ObjectMapper

Jackson 最常用的 API 就是基于”對象綁定” 的 ObjectMapper,它通過 writeValue 的系列方法將 Java 對象序列化為 JSON,并且可以存儲成不同的格式。

  • writeValueAsString(Object value) 方法,將對象存儲成字符串
  • writeValueAsBytes(Object value) 方法,將對象存儲成字節數組
  • writeValue(File resultFile, Object value) 方法,將對象存儲成文件

來看一下存儲成字符串的代碼示例:

  1. import com.fasterxml.jackson.core.JsonProcessingException; 
  2. import com.fasterxml.jackson.databind.ObjectMapper; 
  3.  
  4. /** 
  5.  * 微信搜索「沉默王二」,回復 Java 
  6.  * 
  7.  * @author 沉默王二 
  8.  * @date 2020/11/26 
  9.  */ 
  10. public class Demo { 
  11.     public static void main(String[] args) throws JsonProcessingException { 
  12.         Writer wanger = new Writer("沉默王二", 18); 
  13.         ObjectMapper mapper = new ObjectMapper(); 
  14.         String jsonString = mapper.writerWithDefaultPrettyPrinter() 
  15.                 .writeValueAsString(wanger); 
  16.         System.out.println(jsonString); 
  17.     } 
  18.  
  19. class Writer { 
  20.     private String name
  21.     private int age; 
  22.  
  23.     public Writer(String nameint age) { 
  24.         this.name = name
  25.         this.age = age; 
  26.     } 
  27.  
  28.     public String getName() { 
  29.         return name
  30.     } 
  31.  
  32.     public void setName(String name) { 
  33.         this.name = name
  34.     } 
  35.  
  36.     public int getAge() { 
  37.         return age; 
  38.     } 
  39.  
  40.     public void setAge(int age) { 
  41.         this.age = age; 
  42.     } 

程序輸出結果如下所示:

  1.   "name" : "沉默王二"
  2.   "age" : 18 

不是所有的字段都支持序列化和反序列化,需要符合以下規則:

  • 如果字段的修飾符是 public,則該字段可序列化和反序列化(不是標準寫法)。
  • 如果字段的修飾符不是 public,但是它的 getter 方法和 setter 方法是 public,則該字段可序列化和反序列化。getter 方法用于序列化,setter 方法用于反序列化。
  • 如果字段只有 public 的 setter 方法,而無 public 的 getter 方 法,則該字段只能用于反序列化。

如果想更改默認的序列化和反序列化規則,需要調用 ObjectMapper 的setVisibility() 方法。否則將會拋出 InvalidDefinitionException 異常。

ObjectMapper 通過 readValue 的系列方法從不同的數據源將 JSON 反序列化為 Java 對象。

  • readValue(String content, Class valueType) 方法,將字符串反序列化為 Java 對象
  • readValue(byte[] src, Class valueType) 方法,將字節數組反序列化為 Java 對象
  • readValue(File src, Class valueType) 方法,將文件反序列化為 Java 對象

來看一下將字符串反序列化為 Java 對象的代碼示例:

  1. import com.fasterxml.jackson.core.JsonProcessingException; 
  2. import com.fasterxml.jackson.databind.ObjectMapper; 
  3.  
  4. public class Demo { 
  5.     public static void main(String[] args) throws JsonProcessingException { 
  6.         ObjectMapper mapper = new ObjectMapper(); 
  7.         String jsonString = "{\n" + 
  8.                 "  \"name\" : \"沉默王二\",\n" + 
  9.                 "  \"age\" : 18\n" + 
  10.                 "}"
  11.         Writer deserializedWriter = mapper.readValue(jsonString, Writer.class); 
  12.         System.out.println(deserializedWriter); 
  13.     } 
  14.  
  15. class Writer{ 
  16.     private String name
  17.     private int age; 
  18.  
  19.     // getter/setter 
  20.  
  21.     @Override 
  22.     public String toString() { 
  23.         return "Writer{" + 
  24.                 "name='" + name + '\'' + 
  25.                 ", age=" + age + 
  26.                 '}'
  27.     } 

程序輸出結果如下所示:

  1. Writer{name='沉默王二', age=18} 

PS:如果反序列化的對象有帶參的構造方法,它必須有一個空的默認構造方法,否則將會拋出 InvalidDefinitionException 一行。

  1. Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.itwanger.jackson.Writer` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 
  2.  at [Source: (String)"{ 
  3.   "name" : "沉默王二"
  4.   "age" : 18 
  5. }"; line: 2, column: 3] 
  6.  at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) 
  7.  at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589) 
  8.  at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055) 
  9.  at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297) 
  10.  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326) 
  11.  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159) 
  12.  at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202) 
  13.  at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205) 
  14.  at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173) 
  15.  at com.itwanger.jackson.Demo.main(Demo.java:19) 

Jackson 最常用的 API 就是基于”對象綁定” 的 ObjectMapper,

ObjectMapper 也可以將 JSON 解析為基于“樹模型”的 JsonNode 對象,來看下面的示例。

  1. import com.fasterxml.jackson.core.JsonProcessingException; 
  2. import com.fasterxml.jackson.databind.JsonNode; 
  3. import com.fasterxml.jackson.databind.ObjectMapper; 
  4.  
  5. public class JsonNodeDemo { 
  6.     public static void main(String[] args) throws JsonProcessingException { 
  7.         ObjectMapper mapper = new ObjectMapper(); 
  8.         String json = "{ \"name\" : \"沉默王二\", \"age\" : 18 }"
  9.         JsonNode jsonNode = mapper.readTree(json); 
  10.         String name = jsonNode.get("name").asText(); 
  11.         System.out.println(name); // 沉默王二 
  12.     } 

借助 TypeReference 可以將 JSON 字符串數組轉成泛型 List,來看下面的示例:

  1. import com.fasterxml.jackson.core.JsonProcessingException; 
  2. import com.fasterxml.jackson.core.type.TypeReference; 
  3. import com.fasterxml.jackson.databind.ObjectMapper; 
  4.  
  5. import java.util.List; 
  6.  
  7. public class TypeReferenceDemo { 
  8.     public static void main(String[] args) throws JsonProcessingException { 
  9.         ObjectMapper mapper = new ObjectMapper(); 
  10.         String json = "[{ \"name\" : \"沉默王三\", \"age\" : 18 }, { \"name\" : \"沉默王二\", \"age\" : 19 }]"
  11.         List<Author> listAuthor = mapper.readValue(json, new TypeReference<List<Author>>(){}); 
  12.         System.out.println(listAuthor); 
  13.     } 
  14. class Author{ 
  15.     private String name
  16.     private int age; 
  17.  
  18.     // getter/setter 
  19.  
  20.     // toString 

03、更高級的配置

Jackson 之所以牛掰的一個很重要的因素是可以實現高度靈活的自定義配置。

在實際的應用場景中,JSON 中常常會有一些 Java 對象中沒有的字段,這時候,如果直接解析的話,會拋出 UnrecognizedPropertyException 異常。

下面是一串 JSON 字符串:

  1. String jsonString = "{\n" + 
  2.                 "  \"name\" : \"沉默王二\",\n" + 
  3.                 "  \"age\" : 18\n" + 
  4.                 "  \"sex\" : \"男\",\n" + 
  5.                 "}"

但 Java 對象 Writer 中沒有定義 sex 字段:

  1. class Writer{ 
  2.     private String name
  3.     private int age; 
  4.  
  5.     // getter/setter 

我們來嘗試解析一下:

  1. ObjectMapper mapper = new ObjectMapper(); 
  2. Writer deserializedWriter = mapper.readValue(jsonString, Writer.class); 

不出意外,拋出異常了,sex 無法識別。

  1. Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "sex" (class com.itwanger.jackson.Writer), not marked as ignorable (2 known properties: "name""age"]) 
  2.  at [Source: (String)"{ 
  3.   "name" : "沉默王二"
  4.   "age" : 18, 
  5.   "sex" : "男" 
  6. }"; line: 4, column: 12] (through reference chain: com.itwanger.jackson.Writer["sex"]) 

怎么辦呢?可以通過 configure() 方法忽略掉這些“無法識別”的字段。

  1. mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

除此之外,還有其他一些有用的配置信息,來了解一下:

  1. // 在序列化時忽略值為 null 的屬性 
  2. mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
  3. // 忽略值為默認值的屬性 
  4. mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT); 

04、處理日期格式

對于日期類型的字段,比如說 java.util.Date,如果不指定格式,序列化后將顯示為 long 類型的數據,這種默認格式的可讀性很差。

  1.   "age" : 18, 
  2.   "birthday" : 1606358621209 

怎么辦呢?

第一種方案,在 getter 上使用 @JsonFormat 注解。

  1. private Date birthday; 
  2.  
  3. // GMT+8 是指格林尼治的標準時間,在加上八個小時表示你現在所在時區的時間 
  4. @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss"
  5. public Date getBirthday() { 
  6.     return birthday; 
  7.  
  8. public void setBirthday(Date birthday) { 
  9.     this.birthday = birthday; 

再來看一下結果:

  1.   "age" : 18, 
  2.   "birthday" : "2020-11-26 03:02:30" 

具體代碼如下所示:

  1. ObjectMapper mapper = new ObjectMapper(); 
  2. Writer wanger = new Writer("沉默王二", 18); 
  3. wanger.setBirthday(new Date()); 
  4. String jsonString = mapper.writerWithDefaultPrettyPrinter() 
  5.                 .writeValueAsString(wanger); 
  6. System.out.println(jsonString); 

第二種方案,調用 ObjectMapper 的 setDateFormat() 方法。

  1. ObjectMapper mapper = new ObjectMapper(); 
  2. mapper.setDateFormat(StdDateFormat.getDateTimeInstance()); 
  3. Writer wanger = new Writer("沉默王二", 18); 
  4. wanger.setBirthday(new Date()); 
  5. String jsonString = mapper.writerWithDefaultPrettyPrinter() 
  6.                 .writeValueAsString(wanger); 
  7. System.out.println(jsonString); 

輸出結果如下所示:

  1.   "name" : "沉默王二"
  2.   "age" : 18, 
  3.   "birthday" : "2020年11月26日 上午11:09:51" 

05、字段過濾

在將 Java 對象序列化為 JSON 時,可能有些字段需要過濾,不顯示在 JSON 中,Jackson 有一種比較簡單的實現方式。

@JsonIgnore 用于過濾單個字段。

  1. @JsonIgnore 
  2. public String getName() { 
  3.     return name

@JsonIgnoreProperties 用于過濾多個字段。

  1. @JsonIgnoreProperties(value = { "age","birthday" }) 
  2. class Writer{ 
  3.     private String name
  4.     private int age; 
  5.     private Date birthday; 

06、自定義序列化和反序列化

當 Jackson 默認序列化和反序列化不能滿足實際的開發需要時,可以自定義新的序列化和反序列化類。

自定義的序列化類需要繼承 StdSerializer,同時重寫 serialize() 方法,利用 JsonGenerator 生成 JSON,示例如下:

  1. public class CustomSerializer extends StdSerializer<Man> { 
  2.     protected CustomSerializer(Class<Man> t) { 
  3.         super(t); 
  4.     } 
  5.  
  6.     public CustomSerializer() { 
  7.         this(null); 
  8.     } 
  9.  
  10.     @Override 
  11.     public void serialize(Man value, JsonGenerator gen, SerializerProvider provider) throws IOException { 
  12.         gen.writeStartObject(); 
  13.         gen.writeStringField("name", value.getName()); 
  14.         gen.writeEndObject(); 
  15.     } 
  16.  
  17. class Man{ 
  18.     private int age; 
  19.     private String name
  20.  
  21.     public Man(int age, String name) { 
  22.         this.age = age; 
  23.         this.name = name
  24.     } 
  25.  
  26.     public int getAge() { 
  27.         return age; 
  28.     } 
  29.  
  30.     public void setAge(int age) { 
  31.         this.age = age; 
  32.     } 
  33.  
  34.     public String getName() { 
  35.         return name
  36.     } 
  37.  
  38.     public void setName(String name) { 
  39.         this.name = name
  40.     } 

定義好自定義序列化類后,要想在程序中調用它們,需要將其注冊到 ObjectMapper 的 Module 中,示例如下所示:

  1. ObjectMapper mapper = new ObjectMapper(); 
  2. SimpleModule module = 
  3.         new SimpleModule("CustomSerializer", new Version(1, 0, 0, nullnullnull)); 
  4. module.addSerializer(Man.class, new CustomSerializer()); 
  5. mapper.registerModule(module); 
  6. Man man = new Man( 18,"沉默王二"); 
  7. String json = mapper.writeValueAsString(man); 
  8. System.out.println(json); 

程序輸出結果如下所示:

  1. {"name":"沉默王二"

自定義序列化類 CustomSerializer 中沒有添加 age 字段,所以只輸出了 name 字段。

再來看一下自定義的反序列化類,繼承 StdDeserializer,同時重寫 deserialize() 方法,利用 JsonGenerator 讀取 JSON,示例如下:

  1. public class CustomDeserializer extends StdDeserializer<Woman> { 
  2.     protected CustomDeserializer(Class<?> vc) { 
  3.         super(vc); 
  4.     } 
  5.  
  6.     public CustomDeserializer() { 
  7.         this(null); 
  8.     } 
  9.  
  10.     @Override 
  11.     public Woman deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
  12.         JsonNode node = p.getCodec().readTree(p); 
  13.         Woman woman = new Woman(); 
  14.         int age = (Integer) ((IntNode) node.get("age")).numberValue(); 
  15.         String name = node.get("name").asText(); 
  16.         woman.setAge(age); 
  17.         woman.setName(name); 
  18.         return woman; 
  19.     } 
  20. class Woman{ 
  21.     private int age; 
  22.     private String name
  23.  
  24.     public Woman() { 
  25.     } 
  26.  
  27.     // getter/setter 
  28.  
  29.     @Override 
  30.     public String toString() { 
  31.         return "Woman{" + 
  32.                 "age=" + age + 
  33.                 ", name='" + name + '\'' + 
  34.                 '}'
  35.     } 

通過 JsonNode 把 JSON 讀取到一個樹形結構中,然后通過 JsonNode 的 get 方法將對應字段讀取出來,然后生成新的 Java 對象,并返回。

定義好自定義反序列化類后,要想在程序中調用它們,同樣需要將其注冊到 ObjectMapper 的 Module 中,示例如下所示:

  1. ObjectMapper mapper = new ObjectMapper(); 
  2. SimpleModule module = 
  3.         new SimpleModule("CustomDeserializer", new Version(1, 0, 0, nullnullnull)); 
  4. module.addDeserializer(Woman.class, new CustomDeserializer()); 
  5. mapper.registerModule(module); 
  6. String json = "{ \"name\" : \"三妹\", \"age\" : 18 }"
  7. Woman woman = mapper.readValue(json, Woman.class); 
  8. System.out.println(woman); 

程序輸出結果如下所示:

  1. Woman{age=18, name='三妹'

07、結語

哎呀,好像不錯哦,Jackson 絕對配得上“最牛掰”這三個字。如果只想簡單的序列化和反序列化,使用 ObjectMapper 的 write 和 read 方法即可。

如果還想更進一步的話,就需要對 ObjectMapper 進行一些自定義配置,或者加一些注解,以及直接自定義序列化和反序列化類,更貼近一些 Java 對象。

需要注意的是,對日期格式的字段要多加小心,盡量不要使用默認配置,可讀性很差。

好了,通過這篇文章的系統化介紹,相信讀者朋友們已經完全摸透 Jackson 了,我們下篇文章見。

本文轉載自微信公眾號「沉默王二」,可以通過以下二維碼關注。轉載本文請聯系沉默王二公眾號。

 

責任編輯:武曉燕 來源: 沉默王二
相關推薦

2022-02-14 13:58:32

操作系統JSON格式鴻蒙

2010-01-07 16:37:04

JSON解析器

2010-01-07 17:24:31

JSON 解析器

2009-03-19 09:26:05

RSS解析器MagpieRSS

2023-12-30 13:33:36

Python解析器JSON

2022-06-28 08:17:10

JSON性能反射

2013-07-23 06:39:49

Json字符串到JsoAndroid開發學習Json萬能解析器

2023-02-07 06:55:26

Kafka消費消息

2010-02-22 13:38:50

Python解析器

2010-02-22 16:51:03

Python 解析器

2024-02-22 08:06:45

JSON策略解析器

2021-03-18 10:56:59

SpringMVC參數解析器

2014-05-06 09:27:54

2017-02-14 10:20:43

Java Class解析器

2011-04-22 13:44:34

JacksonJSON

2009-12-14 18:59:27

Ruby解析器

2022-10-20 11:00:52

SQL解析器

2025-06-26 01:10:00

服務定位解析器Spring

2009-06-19 11:42:09

Scala計算器解析

2021-03-26 09:37:12

Java開發代碼
點贊
收藏

51CTO技術棧公眾號

午夜av一区| 欧美成人h版| 国产1区2区3区精品美女| 久久久免费观看| 无遮挡aaaaa大片免费看| 亚洲小少妇裸体bbw| 国产精品色眯眯| 91免费版网站在线观看| 久久久久女人精品毛片九一| 中文日本在线观看| 精品中文字幕一区二区小辣椒| 美女av一区二区| 亚洲天堂av线| 青草在线视频| 国产精品久久久一区麻豆最新章节| 亚洲一区中文字幕在线观看| 日韩不卡在线播放| 亚洲欧洲美洲一区二区三区| 亚洲精品久久久久| 久久精品视频在线观看免费| 国产伦精品一区二区三区视频金莲| 中文字幕一区二区三区蜜月| 精品一区二区三区日本| 国产情侣一区二区| 日韩a一区二区| 欧美精品一区二区不卡 | 国产一区二区三区福利| 国产乱人伦偷精品视频不卡| 色噜噜狠狠狠综合曰曰曰 | 无码人妻精品一区二区三区9厂 | 91精品久久久久久久久99蜜臂| a级黄色一级片| 18视频在线观看| 国产一区二区美女| 国产成人小视频在线观看| 久久久久久久九九九九| 久久国产电影| 亚洲图片在区色| 欧美成人午夜精品免费| 高潮按摩久久久久久av免费| 91精品国产综合久久久久久漫画| 少妇性l交大片| 午夜av不卡| 亚洲午夜激情网页| 91亚洲精品国产| 成人黄色网址| 亚洲卡通欧美制服中文| 亚洲直播在线一区| 亚洲天堂视频在线| 欧美+日本+国产+在线a∨观看| 亚洲最新视频在线| 久久精品无码一区| 欧美日韩免费电影| 欧美综合一区二区三区| www.色偷偷.com| 日韩av电影资源网| 欧美这里有精品| 日本美女高潮视频| 欧美激情不卡| 777久久久精品| 在线观看免费视频污| 欧美一区二区三区婷婷| 欧美日高清视频| 婷婷中文字幕在线观看| 久久99成人| 欧美r级在线观看| www.四虎精品| 青草久久视频| 亚洲人成网在线播放| 国产伦理片在线观看| 成人羞羞网站入口| 精品国产一区久久久| 91精品国产高清91久久久久久| 国产精一区二区| 色综合欧美在线视频区| 一区二区三视频| 国产原创精品视频| 亚洲一区在线视频| 欧美色图另类小说| 99riav视频一区二区| 亚洲高清免费视频| 亚洲精品成人三区| 大地资源网3页在线观看| 一区二区三区美女视频| 亚洲人成无码网站久久99热国产 | 538国产精品一区二区免费视频| 国产欧美日韩另类| 日本aⅴ亚洲精品中文乱码| 成人a视频在线观看| www五月婷婷| 91免费观看在线| 91九色国产在线| 亚洲国产精品久久久久爰性色 | 91精品人妻一区二区三区蜜桃欧美| 国产a久久精品一区二区三区 | 国产视频不卡在线| 欧美在线日韩| 国产不卡av在线免费观看| 91丨九色丨丰满| 久久欧美肥婆一二区| 国产精品亚发布| 国精品人妻无码一区二区三区喝尿| 91丨国产丨九色丨pron| 一区二区三区久久网| 91丝袜在线| 欧美日本一道本| 国产又黄又粗又猛又爽的视频| 日韩精品免费| 97精品国产aⅴ7777| 在线观看免费视频一区| 不卡的看片网站| 一级全黄肉体裸体全过程| 美女91在线看| 日韩午夜在线影院| 中文字幕在线观看免费高清| 韩日在线一区| 国产欧美精品久久久| 性感美女视频一二三| 国产成人av电影在线观看| 欧美日韩成人一区二区三区 | 日本a在线观看| 91精品综合| 欧美亚洲在线播放| 亚洲精品一区二区三区区别| 亚洲国产精品精华液ab| 乱妇乱女熟妇熟女网站| 亚洲专区**| 久久躁狠狠躁夜夜爽| 成人在线观看免费完整| 日本色综合中文字幕| 久久久水蜜桃| 999福利在线视频| 欧美大片在线观看一区二区| 成年人免费视频播放| 日韩av电影一区| 欧美日韩国产高清视频| 99爱在线视频| 亚洲电影免费观看高清完整版在线观看| 天天做夜夜爱爱爱| 欧美日韩影院| 亚洲a成v人在线观看| 麻豆视频免费在线观看| 欧美日韩不卡一区二区| 亚洲熟女少妇一区二区| 日本成人中文字幕在线视频| 欧美国产二区| 欧美xxx网站| 亚洲欧美资源在线| 精品久久久久久久久久久国产字幕| gogogo免费视频观看亚洲一| 黄色一级在线视频| 第一区第二区在线| 韩日欧美一区二区| 香蕉视频911| 岛国av一区二区| 少妇按摩一区二区三区| 亚洲欧美日韩国产综合精品二区| 精品日本一区二区三区| 三级中文字幕在线观看| 亚洲欧美激情在线视频| 波多野结衣绝顶大高潮| 欧美国产视频在线| 亚洲美女爱爱视频| 欧美国产综合| 国产青春久久久国产毛片| 国产女主播在线写真| 色综合中文字幕| 日韩中文字幕有码| 国产一区二区在线观看视频| 草草草视频在线观看| 国产伦精品一区二区三区免费优势| 久久久久久久久91| 日av在线播放| 欧美日韩一区 二区 三区 久久精品| www日本在线观看| 影音先锋亚洲电影| 精品欧美日韩| 国产成+人+综合+亚洲欧美| 久久激情五月丁香伊人| 亚洲国产精品无码久久| 欧美日韩综合视频网址| 成人信息集中地| 成人免费三级在线| 黄色片在线免费| 午夜精品av| 欧美亚洲另类久久综合| 99亚洲男女激情在线观看| 午夜精品久久久久久99热| 理论在线观看| 欧美成人艳星乳罩| 国产第一页在线观看| 亚洲婷婷在线视频| 你懂得在线视频| 免费视频一区二区| www在线观看免费| 日韩中文字幕高清在线观看| 99视频免费观看蜜桃视频| 欧美电影免费观看| 久久99视频精品| 成人在线免费看| 欧美日韩精品在线观看| 欧美自拍偷拍网| 成人免费高清视频在线观看| 三年中国国语在线播放免费| 欧美一区二区| 亚洲精品免费在线看| 国产ts一区| 成人黄色av播放免费| 忘忧草在线影院两性视频| 久久夜色撩人精品| 国产色a在线| 亚洲第一免费播放区| 一本一道人人妻人人妻αv| 天天影视涩香欲综合网| 欧美视频www| 国产欧美视频一区二区| 蜜臀aⅴ国产精品久久久国产老师| 日韩和欧美一区二区三区| 亚洲精品蜜桃久久久久久| 久久一区91| 国产在线视频一区| 成人开心激情| 综合激情国产一区| 色视频免费在线观看| 精品电影一区二区| 国产乱子伦精品无码码专区| 色猫猫国产区一区二在线视频| 日本三级免费看| 一区二区在线观看av| 欧美性生给视频| 国产精品欧美一区喷水| 无码h肉动漫在线观看| 97久久精品人人澡人人爽| 国产精品嫩草69影院| 国内不卡的二区三区中文字幕| 日日噜噜噜噜久久久精品毛片| 国产日韩欧美三区| 日本精品一区二区| 欧美大片1688网站| 欧美一二三视频| 精精国产xxxx视频在线野外| 欧美黄色成人网| 色av手机在线| 精品少妇一区二区30p| 黄网页免费在线观看| www国产精品视频| 粉嫩小泬无遮挡久久久久久| 欧美一区二区三区系列电影| 国产又粗又长又大视频| 欧美久久久久中文字幕| 亚洲一级视频在线观看| 欧美日韩国产天堂| 91在线精品入口| 91精品国产免费| 成人av无码一区二区三区| 日韩亚洲欧美成人一区| 亚洲免费国产视频| 亚洲国产成人91精品| 天堂中文资源在线| 欧美日韩视频在线第一区| 中文有码在线播放| 亚洲永久精品国产| 免费在线观看日韩| 亚洲国产日韩精品| 日韩欧美性视频| 欧美丝袜美女中出在线| 欧美黄色一级大片| 欧美色欧美亚洲另类二区| 91麻豆国产在线| 欧美一级欧美三级在线观看| 亚洲第一页在线观看| 亚洲精品福利视频| 都市激情一区| 欧美成人性色生活仑片| zzzwww在线看片免费| 国产97色在线|日韩| 国模雨婷捆绑高清在线| 91精品国产91久久| 成人国产精品入口免费视频| 91久久国产精品91久久性色| 99这里只有精品视频| 久久草.com| 国产精品伦理久久久久久| 黄色三级中文字幕| 日韩av不卡一区二区| av地址在线观看| 久久先锋资源网| √天堂中文官网8在线| 午夜私人影院久久久久| 中文区中文字幕免费看| 欧美变态tickle挠乳网站| 免费看男男www网站入口在线| 最近的2019中文字幕免费一页 | 精品人妻一区二区三区四区不卡 | 色三级在线观看| 国内精品伊人久久| 欧美成人xxxx| 精品一区二区视频| 外国成人免费视频| av免费在线播放网站| 国产精品69久久久久水密桃| 中文字幕一区二区三区人妻电影| 亚洲欧美aⅴ...| 久久久久久久久久成人| 精品欧美一区二区在线观看| 黄色大片在线免费观看| 久久久久久九九九| 国产精品视频一区视频二区| 免费试看一区| 免费不卡中文字幕在线| 手机福利在线视频| 噜噜噜91成人网| 久久久无码人妻精品无码| 国产精品美女视频| 永久免费无码av网站在线观看| 日韩免费高清av| 永久免费av片在线观看全网站| 26uuu另类亚洲欧美日本老年| 美国十次综合久久| 亚洲一区免费看| 日日摸夜夜添夜夜添国产精品| 美国黄色一级视频| 亚洲色图视频免费播放| 国产精品无码一区| 国产视频亚洲精品| 黄色片视频在线观看| 欧美激情一区二区三区高清视频 | 欧美揉bbbbb揉bbbbb| 深夜福利在线看| 97在线视频一区| 国产成人av毛片| 日韩欧美猛交xxxxx无码| 精品一区二区成人精品| 正在播放国产对白害羞| 在线免费一区三区| 三级理论午夜在线观看| 91成人在线播放| 精品在线网站观看| 日本福利视频一区| 成人自拍视频在线观看| 国产一级片网址| 亚洲第一区在线| 91www在线| 精品伊人久久大线蕉色首页| 国产日韩欧美在线播放不卡| 美女又爽又黄免费| 偷拍与自拍一区| 亚洲欧洲综合在线| 琪琪第一精品导航| 欧美日韩一二三四| 国产三级三级看三级| 国产精品丝袜一区| 97人妻人人澡人人爽人人精品 | 久久久久国内| 特级西西www444人体聚色| 在线观看一区二区精品视频| 国产高清在线看| 成人国产精品一区二区| 亚洲精品成人| 女性生殖扒开酷刑vk| 精品久久久久久久久久久久| 色视频在线看| 国产精品揄拍一区二区| 99久久精品费精品国产风间由美| 亚洲欧美日本一区二区| 有坂深雪av一区二区精品| 黄色一级大片在线免费看国产| 久久久久久久久久久av| 日韩精品a在线观看91| 亚洲精品中文字幕无码蜜桃| 亚洲国产精品精华液2区45| 99久久精品国产色欲| 欧美精品久久久久久久| 欧美影院天天5g天天爽| 制服丝袜综合网| 亚洲一区二区三区在线看| 无码国产伦一区二区三区视频| 日本一本a高清免费不卡| 欧美成免费一区二区视频| 欧美性猛交xx| 一道本成人在线| 国产精品久久久久久福利| 国产激情美女久久久久久吹潮| 亚洲一区国产一区| 亚洲色图100p| 亚洲成年网站在线观看| 在线成人视屏| 丁香婷婷综合激情| 国产视频在线观看一区二区三区| 国产精品爽爽久久久久久| 午夜精品久久久久久久久久久久久| 精品一级毛片| 人妻 丝袜美腿 中文字幕| 色国产精品一区在线观看| av网站网址在线观看| 欧美少妇一区| 粉嫩aⅴ一区二区三区四区| 久久久久久久久久一级| 欧美激情网站在线观看| 成人在线一区|