精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

26uuu国产一区二区三区 | 国产一级二级三级精品| 另类天堂视频在线观看| 国产精品视频网| 99热99这里只有精品| 四虎国产精品永久在线国在线| 亚洲色图丝袜美腿| 激情五月综合色婷婷一区二区| 欧美brazzers| 欧美成人日本| 亚洲欧美第一页| 午夜av中文字幕| 三妻四妾完整版在线观看电视剧| 国产精品日产欧美久久久久| 国产丝袜不卡| 国产乱码精品一区二三区蜜臂| 99精品久久久| 久热精品在线视频| 亚洲一区视频在线播放| 国产成人澳门| 欧美在线你懂得| 男女猛烈激情xx00免费视频| 麻豆tv在线| 久久网这里都是精品| 亚洲最大的av网站| 国产又粗又猛又爽又| 影音先锋久久资源网| 久久精品国产久精国产思思| 2018国产精品| 欧美a一级片| 在线观看视频一区二区欧美日韩| 男人天堂a在线| 免费大片在线观看www| 久久久一区二区三区| 国产伦理一区二区三区| 精品久久人妻av中文字幕| 日本网站在线观看一区二区三区| 91精品国产高清自在线| 国产一级片免费观看| 综合一区二区三区| 视频在线一区二区| 人妻熟人中文字幕一区二区| 亚洲8888| 国产视频精品在线| 久久久精品人妻无码专区| 国产精品高潮呻吟久久久久| 欧美tickling挠脚心丨vk| 久国产精品视频| 狠狠久久综合| 91国在线观看| 人妻丰满熟妇av无码区app| 欧亚av在线| 亚洲成va人在线观看| 精品成在人线av无码免费看| 青春草视频在线观看| 亚洲色图制服丝袜| 视色,视色影院,视色影库,视色网| 香蕉视频在线播放| 国产精品国产三级国产a| 亚洲欧美日韩国产yyy| av在线中文| 国产精品久久久久影院色老大 | 欧美亚洲另类在线| 99视频在线看| 久久久www| 国产成人极品视频| 最近日韩免费视频| 久久99精品久久久久婷婷| 91久久久久久久久久久久久| 国产sm主人调教女m视频| 国产jizzjizz一区二区| 国产日韩欧美精品| 免费在线稳定资源站| 欧美国产乱子伦| 国产人妻互换一区二区| 肉体视频在线| 黑人欧美xxxx| 欧美第一页浮力影院| 激情综合五月| 精品99999| 亚洲av无码一区二区三区人 | 国产欧美精品区一区二区三区 | 日本性爱视频在线观看| 亚洲午夜免费电影| 日韩在线xxx| 一区二区三区无毛| 亚洲国产精久久久久久| 人人爽人人爽人人片| 亚洲澳门在线| 97超碰蝌蚪网人人做人人爽| 中文字幕人妻精品一区| 国产.精品.日韩.另类.中文.在线.播放| 国产乱码精品一区二区三区中文| 每日更新在线观看av| 中文字幕日韩精品一区| 国产午夜福利100集发布| 福利一区二区三区视频在线观看| 日韩欧美成人一区二区| 久久精品成人av| 91精品秘密在线观看| 97avcom| 在线观看国产小视频| 成人免费毛片a| 亚洲一区二区免费视频软件合集| 99爱在线视频| 欧美夫妻性生活| 97超碰在线资源| 欧美成人午夜| 国产精品一区二区三区久久久| 蜜臀久久99精品久久久| 中文字幕一区二区视频| 人妻熟妇乱又伦精品视频| 国产精品18| 国产亚洲精品va在线观看| 国产亚洲精品av| 麻豆精品精品国产自在97香蕉| 国产丝袜不卡| 中文字幕有码在线视频| 欧美日韩亚洲另类| 国产黄色网址在线观看| 亚洲午夜精品久久久久久app| 国产精品亚洲精品| 男人的天堂av高清在线| 亚洲成av人影院在线观看网| 一级片免费在线观看视频| 精品国产精品久久一区免费式| 久久久人成影片一区二区三区观看 | 日本网站在线免费观看视频| 欧美性极品少妇精品网站| 久久久男人的天堂| 欧美a级片网站| 国产日韩欧美中文在线播放| 国产精品一二三区视频| 狠狠躁夜夜躁人人爽超碰91| 人妻激情偷乱频一区二区三区| 91精品啪在线观看国产81旧版| 国产精品久久999| 欧美成人免费| 色综合天天综合网天天看片| 国产精品无码电影| 日韩网站在线| 国产精品一 二 三| 草美女在线观看| 欧美不卡123| 在线免费观看毛片| 成人一道本在线| 99久久免费观看| 伊人www22综合色| 欧美伦理91i| 亚洲高清视频在线播放| 亚洲综合色噜噜狠狠| 在线成人精品视频| 欧美久久综合| 国产精品12| av在线理伦电影| 亚洲精品www久久久久久广东| 日韩xxx高潮hd| 99久久国产综合精品女不卡| 九九九九免费视频| 美女网站一区| 国产精品视频白浆免费视频| 老司机精品影院| 日韩美女天天操| 国产在线免费视频| 91在线精品一区二区| 久久美女福利视频| 欧州一区二区| 91九色国产在线| 日韩123区| 日韩黄在线观看| 亚洲精品一区二区二区| 亚洲乱码日产精品bd| 制服丝袜在线第一页| 亚洲欧美激情诱惑| 五月天亚洲综合小说网| 国产激情综合| 欧美在线视频免费播放| jzzjzzjzz亚洲成熟少妇| 91精品国产免费| 日本网站在线免费观看| 久久这里只有精品首页| 国产三级精品三级在线| 激情综合在线| 欧美尤物一区| 久久久久久久久久久久电影| 97视频在线观看成人| 成人网视频在线观看| 91精品国产手机| 1级黄色大片儿| 国产精品天美传媒| 逼特逼视频在线观看| 日本亚洲最大的色成网站www| 强开小嫩苞一区二区三区网站| aaa国产精品视频| 国产精品久久久久久久久久久久久| а√天堂资源地址在线下载| 日韩av在线免费看| 国产精品一二三四五区| 欧美丝袜第一区| 黑人巨大精品一区二区在线| 久久品道一品道久久精品| 国产sm在线观看| 免费高清在线一区| 日本福利视频在线| 你懂的视频一区二区| 日本一区二区精品视频| 第四色在线一区二区| 国产专区精品视频| 国产欧美一区二区三区精品酒店| 免费97视频在线精品国自产拍| 国产乱理伦片a级在线观看| 亚洲国产精品久久91精品| 国产在成人精品线拍偷自揄拍| 欧美日韩在线视频一区二区| 免费在线观看国产精品| 国产精品久99| 精品成人av一区二区三区| 成人在线综合网站| 国产欧美激情视频| 日本麻豆一区二区三区视频| 国产成人精品视频免费看| 国内精品嫩模av私拍在线观看| 一区二区三区四区免费视频| 精品一区毛片| 蜜桃av噜噜一区二区三| 国产成人aa在线观看网站站| 51精品国产人成在线观看| 国产亚洲欧美日韩精品一区二区三区 | 国产人与zoxxxx另类91| 国产精品一区二区久久久| 日韩三区在线| 日本伊人精品一区二区三区介绍| 麻豆网站免费在线观看| 久久久久国产精品免费| 亚洲小说区图片区都市| 伦理中文字幕亚洲| 福利在线视频网站| 久久久999精品视频| 91在线播放网站| 在线亚洲国产精品网| 国产精品影院在线| 在线亚洲欧美视频| 日本黄色片在线观看| 最新亚洲国产精品| 日本在线免费看| 久久电影一区二区| 2024最新电影免费在线观看| 久久成人免费视频| 影音先锋在线视频| 欧美激情精品久久久久久黑人| 一色桃子av在线| 欧美第一页在线| a国产在线视频| 欧美一级高清免费| 香蕉视频亚洲一级| 国产精品免费一区二区三区都可以| 日韩中文视频| 成人欧美一区二区三区黑人孕妇| 国产精品3区| 国产精品日韩欧美一区二区| 老司机aⅴ在线精品导航| 欧美大香线蕉线伊人久久国产精品 | 日韩一级二级三级精品视频| 亚洲成人黄色片| 亚洲精品按摩视频| 国产乱理伦片a级在线观看| 久久精品福利视频| av手机在线观看| 国产成人精品a视频一区www| 国精品产品一区| 国产激情一区二区三区在线观看 | 国产女同在线观看| 日本乱人伦aⅴ精品| 国产又粗又长视频| 精品动漫一区二区三区在线观看| 五月激情婷婷网| 这里只有精品视频| 人妖欧美1区| 国产97色在线|日韩| 只有精品亚洲| 久久久久久国产精品mv| 97视频精品| 免费看黄在线看| 麻豆国产欧美日韩综合精品二区| 成年人看片网站| 久久久久99精品国产片| 国产精品视频一区二区在线观看| 亚洲在线免费播放| av片免费观看| 日韩一级片在线观看| 日本福利片在线| 久久综合伊人77777| 日韩精品av| 97自拍视频| 北条麻妃国产九九九精品小说| 4444在线观看| 日韩精品国产精品| 国产精品久久久久久亚洲色| 国产精品每日更新在线播放网址| 国产网址在线观看| 欧美精品日韩一本| 欧美美女搞黄| 欧美精品videossex性护士| h1515四虎成人| 精品国产一二| 欧美成人中文| 亚洲 激情 在线| 91蝌蚪国产九色| 精品无码免费视频| 337p亚洲精品色噜噜噜| 久久伊伊香蕉| 97色伦亚洲国产| 亚洲国产中文在线| 一区二区三区不卡在线| 首页欧美精品中文字幕| 女同性恋一区二区三区| 亚洲免费在线视频一区 二区| 波多野结衣二区三区| 日韩成人av网址| 国产蜜臀av在线播放| 91久久精品美女| 久久麻豆精品| 色悠悠久久综合网| 欧美国产视频在线| 国产成人无码av| 日韩二区三区在线| 国产传媒在线| 国产精品欧美久久| 激情综合亚洲| 理论片大全免费理伦片| 一区二区成人在线视频| 国产成人精品亚洲精品色欲| 不用播放器成人网| 婷婷激情成人| 伊人色综合影院| 国内精品久久久久影院一蜜桃| av资源在线免费观看| 欧美日韩一区 二区 三区 久久精品 | 国产精品亚洲d| 日韩欧美一区二区在线观看| 久久久久久穴| 一色道久久88加勒比一| 日本道色综合久久| 高清福利在线观看| 国产精品中文字幕久久久| 日本在线电影一区二区三区| 中文字幕第80页| 国产精品国产三级国产| 国产精品久久久国产盗摄| 久久天天躁狠狠躁夜夜躁 | 91精品国产一区二区| a级片国产精品自在拍在线播放| 91久久精品美女高潮| 亚洲一区二区日韩| 日本人dh亚洲人ⅹxx| 亚洲国产wwwccc36天堂| 欧美一区二区黄片| 欧美一区二区视频97| 国产成人ay| 在线观看国产一级片| 亚洲欧洲综合另类| 蜜桃视频久久一区免费观看入口| 性色av一区二区三区免费| 色婷婷综合久久久久久| 亚州精品一二三区| 亚洲欧美偷拍另类a∨色屁股| 精品人妻午夜一区二区三区四区 | av日韩久久| 成人免费观看在线| 久久久亚洲欧洲日产国码αv| 最近中文字幕在线观看| 久久国产精品久久久| 美女一区二区在线观看| 男女啪啪网站视频| 亚洲女子a中天字幕| 日本黄视频在线观看| 国产成一区二区| 亚洲一区二区三区| 精品少妇人妻一区二区黑料社区| 欧美军同video69gay| 超级碰碰不卡在线视频| 色噜噜一区二区| 国产成人在线色| 日韩精品一区不卡| 色综合久久天天综线观看| 亚洲精品国产setv| 国产永久免费网站| 日韩欧美中文在线| 午夜小视频福利在线观看| 欧美日韩精品免费看| 国产麻豆视频一区二区| 6080午夜伦理| 欧美极品美女视频网站在线观看免费 | 激情综合五月婷婷| 亚洲 欧美 视频| 欧美大尺度激情区在线播放| 九九综合九九| 日本少妇xxxx软件| 在线电影国产精品| 成人免费福利|