@@ -10,18 +10,7 @@ namespace WebApiClientCore.Serialization.JsonConverters
1010 /// 支持DateTime和DateTimeOffset
1111 /// </summary>
1212 public class JsonDateTimeConverter : JsonConverterFactory
13- {
14- /// <summary>
15- /// 获取ISO8601格式的实例
16- /// </summary>
17- public static JsonDateTimeConverter Default { get ; } = new JsonDateTimeConverter ( "O" ) ;
18-
19- /// <summary>
20- /// 获取本设备的时间格式的实例
21- /// </summary>
22- public static JsonDateTimeConverter LocalMachine { get ; } = new JsonDateTimeConverter ( $ "{ DateTimeFormatInfo . CurrentInfo . ShortDatePattern } { DateTimeFormatInfo . CurrentInfo . LongTimePattern } ") ;
23-
24-
13+ {
2514 /// <summary>
2615 /// 获取日期时间格式
2716 /// </summary>
@@ -44,7 +33,12 @@ public JsonDateTimeConverter(string dateTimeFormat)
4433 /// <returns></returns>
4534 public override bool CanConvert ( Type typeToConvert )
4635 {
47- return typeToConvert == typeof ( DateTime ) || typeToConvert == typeof ( DateTimeOffset ) ;
36+ // .net5以前,JsonConverterAttribute不支持处理有值的可空类型属性
37+ // 所以需要编写可空类型日期时间的转换器
38+ return typeToConvert == typeof ( DateTime ) ||
39+ typeToConvert == typeof ( DateTime ? ) ||
40+ typeToConvert == typeof ( DateTimeOffset ) ||
41+ typeToConvert == typeof ( DateTimeOffset ? ) ;
4842 }
4943
5044 /// <summary>
@@ -59,10 +53,18 @@ public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializer
5953 {
6054 return new DateTimeConverter ( this . DateTimeFormat ) ;
6155 }
62- else
56+
57+ if ( typeToConvert == typeof ( DateTime ? ) )
58+ {
59+ return new NullableDateTimeConverter ( this . DateTimeFormat ) ;
60+ }
61+
62+ if ( typeToConvert == typeof ( DateTimeOffset ) )
6363 {
6464 return new DateTimeOffsetConverter ( this . DateTimeFormat ) ;
6565 }
66+
67+ return new NullableDateTimeOffsetConverter ( this . DateTimeFormat ) ;
6668 }
6769
6870 /// <summary>
@@ -79,11 +81,11 @@ public DateTimeConverter(string format)
7981
8082 public override DateTime Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
8183 {
82- if ( reader . TokenType == JsonTokenType . String )
84+ if ( reader . TryGetDateTime ( out var value ) )
8385 {
84- return DateTime . Parse ( reader . GetString ( ) ) ;
86+ return value ;
8587 }
86- return reader . GetDateTime ( ) ;
88+ return DateTime . Parse ( reader . GetString ( ) ) ;
8789 }
8890
8991 public override void Write ( Utf8JsonWriter writer , DateTime value , JsonSerializerOptions options )
@@ -93,6 +95,43 @@ public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializer
9395 }
9496 }
9597
98+
99+ /// <summary>
100+ /// DateTime?转换器
101+ /// </summary>
102+ private class NullableDateTimeConverter : JsonConverter < DateTime ? >
103+ {
104+ private readonly string format ;
105+
106+ public NullableDateTimeConverter ( string format )
107+ {
108+ this . format = format ;
109+ }
110+
111+ public override DateTime ? Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
112+ {
113+ if ( reader . TryGetDateTime ( out var value ) )
114+ {
115+ return value ;
116+ }
117+
118+ return DateTime . Parse ( reader . GetString ( ) ) ;
119+ }
120+
121+ public override void Write ( Utf8JsonWriter writer , DateTime ? value , JsonSerializerOptions options )
122+ {
123+ if ( value == null )
124+ {
125+ writer . WriteNullValue ( ) ;
126+ }
127+ else
128+ {
129+ var dateTimeString = value . Value . ToString ( this . format , CultureInfo . InvariantCulture ) ;
130+ writer . WriteStringValue ( dateTimeString ) ;
131+ }
132+ }
133+ }
134+
96135 /// <summary>
97136 /// DateTimeOffset转换器
98137 /// </summary>
@@ -107,11 +146,11 @@ public DateTimeOffsetConverter(string format)
107146
108147 public override DateTimeOffset Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
109148 {
110- if ( reader . TokenType == JsonTokenType . String )
149+ if ( reader . TryGetDateTimeOffset ( out var value ) )
111150 {
112- return DateTimeOffset . Parse ( reader . GetString ( ) ) ;
151+ return value ;
113152 }
114- return reader . GetDateTimeOffset ( ) ;
153+ return DateTimeOffset . Parse ( reader . GetString ( ) ) ;
115154 }
116155
117156 public override void Write ( Utf8JsonWriter writer , DateTimeOffset value , JsonSerializerOptions options )
@@ -120,5 +159,41 @@ public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSeri
120159 writer . WriteStringValue ( dateTimeString ) ;
121160 }
122161 }
162+
163+
164+ /// <summary>
165+ /// DateTimeOffset?转换器
166+ /// </summary>
167+ private class NullableDateTimeOffsetConverter : JsonConverter < DateTimeOffset ? >
168+ {
169+ private readonly string format ;
170+
171+ public NullableDateTimeOffsetConverter ( string format )
172+ {
173+ this . format = format ;
174+ }
175+
176+ public override DateTimeOffset ? Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
177+ {
178+ if ( reader . TryGetDateTimeOffset ( out var value ) )
179+ {
180+ return value ;
181+ }
182+ return DateTimeOffset . Parse ( reader . GetString ( ) ) ;
183+ }
184+
185+ public override void Write ( Utf8JsonWriter writer , DateTimeOffset ? value , JsonSerializerOptions options )
186+ {
187+ if ( value == null )
188+ {
189+ writer . WriteNullValue ( ) ;
190+ }
191+ else
192+ {
193+ var dateTimeString = value . Value . ToString ( this . format , CultureInfo . InvariantCulture ) ;
194+ writer . WriteStringValue ( dateTimeString ) ;
195+ }
196+ }
197+ }
123198 }
124199}
0 commit comments