From 03704ebb1e74483789711306d18da210ebdf8667 Mon Sep 17 00:00:00 2001 From: devhl Date: Sun, 27 Sep 2026 15:11:45 -0400 Subject: [PATCH 1/2] improve date deserialization --- .../DateOnlyJsonConverter.mustache | 6 +- .../DateOnlyNullableJsonConverter.mustache | 5 +- .../DateTimeJsonConverter.mustache | 6 +- .../DateTimeNullableJsonConverter.mustache | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../UnitTest1.cs | 118 ++++++++++++++++++ .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateOnlyJsonConverter.cs | 6 +- .../Client/DateOnlyNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- .../Client/DateTimeJsonConverter.cs | 6 +- .../Client/DateTimeNullableJsonConverter.cs | 5 +- 169 files changed, 706 insertions(+), 336 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyJsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyJsonConverter.mustache index 94388357c0bd..57dd16112e0c 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyJsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyJsonConverter.mustache @@ -28,8 +28,8 @@ namespace {{packageName}}.{{clientPackage}} /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString(){{nrt!}}; @@ -37,7 +37,7 @@ namespace {{packageName}}.{{clientPackage}} if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyNullableJsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyNullableJsonConverter.mustache index 11e0de144780..9ebbc03405f9 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyNullableJsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyNullableJsonConverter.mustache @@ -31,13 +31,16 @@ namespace {{packageName}}.{{clientPackage}} if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString(){{nrt!}}; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeJsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeJsonConverter.mustache index bf5059fcaefb..8ef9d18dc9b7 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeJsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeJsonConverter.mustache @@ -28,8 +28,8 @@ namespace {{packageName}}.{{clientPackage}} /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(){{nrt!}}; @@ -37,7 +37,7 @@ namespace {{packageName}}.{{clientPackage}} if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeNullableJsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeNullableJsonConverter.mustache index bbc036490302..34d310c34a01 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeNullableJsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeNullableJsonConverter.mustache @@ -31,13 +31,16 @@ namespace {{packageName}}.{{clientPackage}} if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(){{nrt!}}; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 671c407f55a0..2b2239a87098 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index ae9a253b5aa1..6de006b62ed3 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 79fb8600e4be..76226325c39d 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 26d8b0757ba4..dbc6f0573cad 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index acf239fbeda9..4e4b03418003 100644 --- a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index e69101609208..09454761fb5d 100644 --- a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index fb4e686974d1..73e9fd6fdbc3 100644 --- a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 5f6b23204145..748cfdb3d43a 100644 --- a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index f45d5c1fed8c..512e05fd509a 100644 --- a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 597cf6574325..49bc9ece4d27 100644 --- a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 65bfa996f43f..81c00ab88d89 100644 --- a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 8faf51a1c301..31658d69ad75 100644 --- a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 04b243233ad5..23b60f885ca9 100644 --- a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 79a84687d295..3604f9543244 100644 --- a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index de6a37a17df7..dd1413c6b666 100644 --- a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02b767330d0a..02c819724591 100644 --- a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index a706bf0af80c..48fce47fe759 100644 --- a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 55f069a422b3..f0526b8b4595 100644 --- a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a62c3404857b..3b08eb8beb43 100644 --- a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index adcf37ce6167..b8f4494f2357 100644 --- a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 67c131639b6b..bede9f1b8437 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 5958ab9a6c19..21344ef6081c 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 24a4098f0054..646edae36ea9 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 9b8883e76a6a..3f94c9cd9526 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 9102de63f421..ec1b0e069756 100644 --- a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -38,8 +38,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -47,7 +47,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index fe89342ba7db..0060c356d567 100644 --- a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -41,13 +41,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index fb959c7d7cc9..852ae5112432 100644 --- a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -52,8 +52,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -61,7 +61,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 454404eb8863..ac0ac747ba45 100644 --- a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -55,13 +55,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 04b243233ad5..23b60f885ca9 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 79a84687d295..3604f9543244 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index de6a37a17df7..dd1413c6b666 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02b767330d0a..02c819724591 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 671c407f55a0..2b2239a87098 100644 --- a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index ae9a253b5aa1..6de006b62ed3 100644 --- a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 79fb8600e4be..76226325c39d 100644 --- a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 26d8b0757ba4..dbc6f0573cad 100644 --- a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 74dd3f152183..e581eb202123 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString(); @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index e017a70ec492..898d073d622c 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString(); foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 623f3c18353c..63ed74c36c48 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 43730a86b868..a1bc78148d09 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 04b243233ad5..23b60f885ca9 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 79a84687d295..3604f9543244 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index de6a37a17df7..dd1413c6b666 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02b767330d0a..02c819724591 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 74dd3f152183..e581eb202123 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString(); @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index e017a70ec492..898d073d622c 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString(); foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 623f3c18353c..63ed74c36c48 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 43730a86b868..a1bc78148d09 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 04b243233ad5..23b60f885ca9 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 79a84687d295..3604f9543244 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index de6a37a17df7..dd1413c6b666 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02b767330d0a..02c819724591 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 1ebd1220b622..a0df38fc3a0f 100644 --- a/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index e92db186bb60..34e65f36aa3f 100644 --- a/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a7f3806b960f..28d63aa02c0f 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index c818977618f2..227de3286490 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 68e90f4ecbb2..7b594c9aa158 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 3cb4b6ce51e7..1e005cc4cbf5 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 68e90f4ecbb2..7b594c9aa158 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 3cb4b6ce51e7..1e005cc4cbf5 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 973f9e9d4e80..f7200a0cbf0f 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index b491c61f07fa..682ecc16fefc 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 68e90f4ecbb2..7b594c9aa158 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 3cb4b6ce51e7..1e005cc4cbf5 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 973f9e9d4e80..f7200a0cbf0f 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index b491c61f07fa..682ecc16fefc 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 52e971d082a7..2ddbdde45524 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 968d29161b12..8116fb106b66 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a7f3806b960f..28d63aa02c0f 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index c818977618f2..227de3286490 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 68e90f4ecbb2..7b594c9aa158 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 3cb4b6ce51e7..1e005cc4cbf5 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 68e90f4ecbb2..7b594c9aa158 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 3cb4b6ce51e7..1e005cc4cbf5 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 973f9e9d4e80..f7200a0cbf0f 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index b491c61f07fa..682ecc16fefc 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 68e90f4ecbb2..7b594c9aa158 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 3cb4b6ce51e7..1e005cc4cbf5 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 973f9e9d4e80..f7200a0cbf0f 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index b491c61f07fa..682ecc16fefc 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 52e971d082a7..2ddbdde45524 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 968d29161b12..8116fb106b66 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 671c407f55a0..2b2239a87098 100644 --- a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index ae9a253b5aa1..6de006b62ed3 100644 --- a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 79fb8600e4be..76226325c39d 100644 --- a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 26d8b0757ba4..dbc6f0573cad 100644 --- a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 74dd3f152183..e581eb202123 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString(); @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index e017a70ec492..898d073d622c 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString(); foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 623f3c18353c..63ed74c36c48 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 43730a86b868..a1bc78148d09 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/ManualPetstoreTests/OpenAPIClient-generichost-manual-tests/UnitTest1.cs b/samples/client/petstore/csharp/generichost/net8/ManualPetstoreTests/OpenAPIClient-generichost-manual-tests/UnitTest1.cs index 6f9924c8e141..74f1bba7c57e 100644 --- a/samples/client/petstore/csharp/generichost/net8/ManualPetstoreTests/OpenAPIClient-generichost-manual-tests/UnitTest1.cs +++ b/samples/client/petstore/csharp/generichost/net8/ManualPetstoreTests/OpenAPIClient-generichost-manual-tests/UnitTest1.cs @@ -53,6 +53,124 @@ public void Apple() Assert.AreEqual(expected, actual); } + [TestMethod] + public void NullableDateTimeDeserializesNull() + { + DateTime? actual = JsonSerializer.Deserialize("null", _jsonSerializerOptions); + + Assert.IsNull(actual); + } + + [TestMethod] + public void NullableDateTimeDeserializesValidValue() + { + DateTime? actual = JsonSerializer.Deserialize("\"2024-01-02T03:04:05Z\"", _jsonSerializerOptions); + + Assert.AreEqual(new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc), actual); + } + + [TestMethod] + public void NullableDateTimeRejectsInvalidValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"not-a-date\"", _jsonSerializerOptions)); + } + + [TestMethod] + public void NullableDateTimeRejectsNonStringValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("123", _jsonSerializerOptions)); + } + + [TestMethod] + public void DateTimeDeserializesValidValue() + { + DateTime actual = JsonSerializer.Deserialize("\"2024-01-02T03:04:05Z\"", _jsonSerializerOptions); + + Assert.AreEqual(new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc), actual); + } + + [TestMethod] + public void DateTimeRejectsNull() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("null", _jsonSerializerOptions)); + } + + [TestMethod] + public void DateTimeRejectsInvalidValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"not-a-date\"", _jsonSerializerOptions)); + } + + [TestMethod] + public void DateTimeRejectsNonStringValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("123", _jsonSerializerOptions)); + } + + [TestMethod] + public void NullableDateOnlyDeserializesNull() + { + DateOnly? actual = JsonSerializer.Deserialize("null", _jsonSerializerOptions); + + Assert.IsNull(actual); + } + + [TestMethod] + public void NullableDateOnlyDeserializesValidValue() + { + DateOnly? actual = JsonSerializer.Deserialize("\"2024-01-02\"", _jsonSerializerOptions); + + Assert.AreEqual(new DateOnly(2024, 1, 2), actual); + } + + [TestMethod] + public void NullableDateOnlyRejectsInvalidValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"not-a-date\"", _jsonSerializerOptions)); + } + + [TestMethod] + public void NullableDateOnlyRejectsNonStringValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("123", _jsonSerializerOptions)); + } + + [TestMethod] + public void DateOnlyDeserializesValidValue() + { + DateOnly actual = JsonSerializer.Deserialize("\"2024-01-02\"", _jsonSerializerOptions); + + Assert.AreEqual(new DateOnly(2024, 1, 2), actual); + } + + [TestMethod] + public void DateOnlyRejectsNull() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("null", _jsonSerializerOptions)); + } + + [TestMethod] + public void DateOnlyRejectsInvalidValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"not-a-date\"", _jsonSerializerOptions)); + } + + [TestMethod] + public void DateOnlyRejectsNonStringValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("123", _jsonSerializerOptions)); + } + [TestMethod] public void Pig() { diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 04b243233ad5..23b60f885ca9 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 79a84687d295..3604f9543244 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index de6a37a17df7..dd1413c6b666 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02b767330d0a..02c819724591 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 74dd3f152183..e581eb202123 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString(); @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index e017a70ec492..898d073d622c 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString(); foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 623f3c18353c..63ed74c36c48 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 43730a86b868..a1bc78148d09 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 04b243233ad5..23b60f885ca9 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 79a84687d295..3604f9543244 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index de6a37a17df7..dd1413c6b666 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02b767330d0a..02c819724591 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 1ebd1220b622..a0df38fc3a0f 100644 --- a/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index e92db186bb60..34e65f36aa3f 100644 --- a/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 671c407f55a0..2b2239a87098 100644 --- a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index ae9a253b5aa1..6de006b62ed3 100644 --- a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 79fb8600e4be..76226325c39d 100644 --- a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 26d8b0757ba4..dbc6f0573cad 100644 --- a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 74dd3f152183..e581eb202123 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString(); @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index e017a70ec492..898d073d622c 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString(); foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 623f3c18353c..63ed74c36c48 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 43730a86b868..a1bc78148d09 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 04b243233ad5..23b60f885ca9 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 79a84687d295..3604f9543244 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index de6a37a17df7..dd1413c6b666 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02b767330d0a..02c819724591 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ddd26d4eafca..6d06cee3e925 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index a4e9918e0aa5..941957b1fdb4 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 4be8e3a725e0..a205b7dc2271 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 06d46536f037..0546f8625c4e 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 74dd3f152183..e581eb202123 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString(); @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index e017a70ec492..898d073d622c 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString(); foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 623f3c18353c..63ed74c36c48 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 43730a86b868..a1bc78148d09 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 04b243233ad5..23b60f885ca9 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -37,8 +37,8 @@ public class DateOnlyJsonConverter : JsonConverter /// /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); string value = reader.GetString()!; @@ -46,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 79a84687d295..3604f9543244 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -40,13 +40,16 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index de6a37a17df7..dd1413c6b666 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -51,8 +51,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -60,7 +60,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02b767330d0a..02c819724591 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -54,13 +54,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 1ebd1220b622..a0df38fc3a0f 100644 --- a/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString()!; @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index e92db186bb60..34e65f36aa3f 100644 --- a/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString()!; foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 973f9e9d4e80..f7200a0cbf0f 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -53,8 +53,8 @@ public class DateTimeJsonConverter : JsonConverter /// /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (reader.TokenType == JsonTokenType.Null) - throw new NotSupportedException(); + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); string value = reader.GetString(); @@ -62,7 +62,7 @@ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new NotSupportedException(); + throw new JsonException("The JSON value is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index b491c61f07fa..682ecc16fefc 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -56,13 +56,16 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; + if (reader.TokenType != JsonTokenType.String) + throw new JsonException("The JSON value is not a valid date-time."); + string value = reader.GetString(); foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - return null; + throw new JsonException("The JSON value is not a valid date-time."); } /// From dcc02cc4669fc57d9f1618c37a968696b97c35a4 Mon Sep 17 00:00:00 2001 From: devhl Date: Sun, 27 Sep 2026 18:06:05 -0400 Subject: [PATCH 2/2] address comments --- .../generichost/DateFormats.mustache | 3 +- .../DateOnlyJsonConverter.mustache | 4 +- .../DateOnlyNullableJsonConverter.mustache | 22 +--- .../generichost/DateTimeFormats.mustache | 25 +---- .../DateTimeJsonConverter.mustache | 13 ++- .../DateTimeNullableJsonConverter.mustache | 22 +--- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../UnitTest1.cs | 105 ++++++++++++++++-- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateOnlyJsonConverter.cs | 7 +- .../Client/DateOnlyNullableJsonConverter.cs | 23 +--- .../Client/DateTimeJsonConverter.cs | 29 ++--- .../Client/DateTimeNullableJsonConverter.cs | 37 +----- .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ .../Client/DateTimeJsonConverter.cs | 32 ++---- .../Client/DateTimeNullableJsonConverter.cs | 39 +------ 171 files changed, 946 insertions(+), 3598 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateFormats.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateFormats.mustache index 920ecda88fad..0bf8fee09bc5 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateFormats.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateFormats.mustache @@ -1,2 +1 @@ - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyJsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyJsonConverter.mustache index 57dd16112e0c..4c4eb63e36f3 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyJsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyJsonConverter.mustache @@ -29,7 +29,7 @@ namespace {{packageName}}.{{clientPackage}} /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString(){{nrt!}}; @@ -37,7 +37,7 @@ namespace {{packageName}}.{{clientPackage}} if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyNullableJsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyNullableJsonConverter.mustache index 9ebbc03405f9..fc8d8fde221e 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyNullableJsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateOnlyNullableJsonConverter.mustache @@ -1,6 +1,5 @@ {{>partial_header}} using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,14 +11,6 @@ namespace {{packageName}}.{{clientPackage}} /// {{>visibility}} class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { -{{>DateFormats}} - - }; - /// /// Returns a DateOnly from the Json object /// @@ -31,16 +22,7 @@ namespace {{packageName}}.{{clientPackage}} if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString(){{nrt!}}; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -54,7 +36,7 @@ namespace {{packageName}}.{{clientPackage}} if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("{{{dateFormat}}}", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeFormats.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeFormats.mustache index 85ed99a2c9e7..087e2de86416 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeFormats.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeFormats.mustache @@ -1,22 +1,3 @@ - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - {{^supportsDateOnly}} - "yyyy'-'MM'-'dd", - {{/supportsDateOnly}} - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - {{^supportsDateOnly}} - "yyyyMMdd" - {{/supportsDateOnly}} \ No newline at end of file + {{^supportsDateOnly}} + "yyyy'-'MM'-'dd" + {{/supportsDateOnly}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeJsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeJsonConverter.mustache index 8ef9d18dc9b7..136d64d1e71e 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeJsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeJsonConverter.mustache @@ -29,15 +29,24 @@ namespace {{packageName}}.{{clientPackage}} /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(){{nrt!}}; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeNullableJsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeNullableJsonConverter.mustache index 34d310c34a01..7a022dc3a4b3 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeNullableJsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/DateTimeNullableJsonConverter.mustache @@ -1,6 +1,5 @@ {{>partial_header}} using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,14 +11,6 @@ namespace {{packageName}}.{{clientPackage}} /// {{>visibility}} class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { -{{>DateTimeFormats}} - - }; - /// /// Returns a DateTime from the Json object /// @@ -31,16 +22,7 @@ namespace {{packageName}}.{{clientPackage}} if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(){{nrt!}}; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -54,7 +36,7 @@ namespace {{packageName}}.{{clientPackage}} if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("{{{dateTimeFormat}}}", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 2b2239a87098..afc006d07d51 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 6de006b62ed3..a37df81ffaac 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 76226325c39d..1835da31d9d7 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index dbc6f0573cad..89a68bb80a48 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 4e4b03418003..a5fe0703289b 100644 --- a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 09454761fb5d..3a9f72043f62 100644 --- a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 73e9fd6fdbc3..79c212398590 100644 --- a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 748cfdb3d43a..23404496f7b1 100644 --- a/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 512e05fd509a..8aeb825279e2 100644 --- a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 49bc9ece4d27..5c155f209a00 100644 --- a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 81c00ab88d89..283be6f1157c 100644 --- a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 31658d69ad75..d998d6a03054 100644 --- a/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 23b60f885ca9..a9d770eec078 100644 --- a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 3604f9543244..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index dd1413c6b666..ed43f4a40d07 100644 --- a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02c819724591..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 48fce47fe759..fa25f203569b 100644 --- a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index f0526b8b4595..552eb833561f 100644 --- a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 3b08eb8beb43..a0ed0676f942 100644 --- a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index b8f4494f2357..0678f2235633 100644 --- a/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/NullTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index bede9f1b8437..ba4d3535b0da 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 21344ef6081c..4b2513be6adb 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 646edae36ea9..abde333f33e3 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 3f94c9cd9526..c9e661c544c0 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index ec1b0e069756..041e4bcaebd3 100644 --- a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -25,8 +25,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -39,7 +38,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -47,7 +46,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 0060c356d567..23258dbc73e1 100644 --- a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -9,7 +9,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -21,15 +20,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -41,16 +31,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -64,7 +45,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 852ae5112432..a5b30390e61b 100644 --- a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -25,22 +25,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -53,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index ac0ac747ba45..b1f65be09170 100644 --- a/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/Tags/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -9,7 +9,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -21,29 +20,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -55,16 +31,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -78,7 +45,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 23b60f885ca9..a9d770eec078 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 3604f9543244..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index dd1413c6b666..ed43f4a40d07 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02c819724591..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 2b2239a87098..afc006d07d51 100644 --- a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 6de006b62ed3..a37df81ffaac 100644 --- a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 76226325c39d..1835da31d9d7 100644 --- a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index dbc6f0573cad..89a68bb80a48 100644 --- a/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index e581eb202123..e9b9e309a834 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString(); @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 898d073d622c..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 63ed74c36c48..c11d7360b76b 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index a1bc78148d09..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 23b60f885ca9..a9d770eec078 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 3604f9543244..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index dd1413c6b666..ed43f4a40d07 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02c819724591..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index e581eb202123..e9b9e309a834 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString(); @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 898d073d622c..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 63ed74c36c48..c11d7360b76b 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index a1bc78148d09..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 23b60f885ca9..a9d770eec078 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 3604f9543244..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index dd1413c6b666..ed43f4a40d07 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02c819724591..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a0df38fc3a0f..3a15feabc8a6 100644 --- a/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 34e65f36aa3f..4479035069ce 100644 --- a/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net10/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 28d63aa02c0f..e370c07ee47e 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 227de3286490..7cdfe4c17fad 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 7b594c9aa158..2af4af5178f4 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 1e005cc4cbf5..d349a105ad36 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 7b594c9aa158..2af4af5178f4 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 1e005cc4cbf5..d349a105ad36 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index f7200a0cbf0f..43433df880d7 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 682ecc16fefc..f005882903c2 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 7b594c9aa158..2af4af5178f4 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 1e005cc4cbf5..d349a105ad36 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index f7200a0cbf0f..43433df880d7 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 682ecc16fefc..f005882903c2 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 2ddbdde45524..ee323ef035a9 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 8116fb106b66..4479035069ce 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 28d63aa02c0f..e370c07ee47e 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 227de3286490..7cdfe4c17fad 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 7b594c9aa158..2af4af5178f4 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 1e005cc4cbf5..d349a105ad36 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 7b594c9aa158..2af4af5178f4 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 1e005cc4cbf5..d349a105ad36 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index f7200a0cbf0f..43433df880d7 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 682ecc16fefc..f005882903c2 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 7b594c9aa158..2af4af5178f4 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 1e005cc4cbf5..d349a105ad36 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index f7200a0cbf0f..43433df880d7 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 682ecc16fefc..f005882903c2 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 2ddbdde45524..ee323ef035a9 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 8116fb106b66..4479035069ce 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 2b2239a87098..afc006d07d51 100644 --- a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 6de006b62ed3..a37df81ffaac 100644 --- a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 76226325c39d..1835da31d9d7 100644 --- a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index dbc6f0573cad..89a68bb80a48 100644 --- a/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index e581eb202123..e9b9e309a834 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString(); @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 898d073d622c..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 63ed74c36c48..c11d7360b76b 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index a1bc78148d09..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/ManualPetstoreTests/OpenAPIClient-generichost-manual-tests/UnitTest1.cs b/samples/client/petstore/csharp/generichost/net8/ManualPetstoreTests/OpenAPIClient-generichost-manual-tests/UnitTest1.cs index 74f1bba7c57e..68a0b39d8ff7 100644 --- a/samples/client/petstore/csharp/generichost/net8/ManualPetstoreTests/OpenAPIClient-generichost-manual-tests/UnitTest1.cs +++ b/samples/client/petstore/csharp/generichost/net8/ManualPetstoreTests/OpenAPIClient-generichost-manual-tests/UnitTest1.cs @@ -66,21 +66,51 @@ public void NullableDateTimeDeserializesValidValue() { DateTime? actual = JsonSerializer.Deserialize("\"2024-01-02T03:04:05Z\"", _jsonSerializerOptions); + Assert.IsNotNull(actual); Assert.AreEqual(new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc), actual); + Assert.AreEqual(DateTimeKind.Utc, actual.Value.Kind); } [TestMethod] - public void NullableDateTimeRejectsInvalidValue() + public void NullableDateTimeDeserializesExtendedFractionalSeconds() + { + DateTime? actual = JsonSerializer.Deserialize("\"2020-01-01T00:00:00.123456789Z\"", _jsonSerializerOptions); + + Assert.IsNotNull(actual); + Assert.AreEqual(DateTimeKind.Utc, actual.Value.Kind); + Assert.AreEqual(new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddTicks(1234567), actual.Value); + } + + [TestMethod] + public void NullableDateTimeRejectsMissingTimeZone() { Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"2024-01-02T03:04:05\"", _jsonSerializerOptions)); + } + + [TestMethod] + public void NullableDateTimeRejectsInvalidValue() + { + JsonException exception = Assert.ThrowsException( () => JsonSerializer.Deserialize("\"not-a-date\"", _jsonSerializerOptions)); + + StringAssert.Contains(exception.Message, "The JSON string is not a valid date-time."); } [TestMethod] public void NullableDateTimeRejectsNonStringValue() { - Assert.ThrowsException( + JsonException exception = Assert.ThrowsException( () => JsonSerializer.Deserialize("123", _jsonSerializerOptions)); + + StringAssert.Contains(exception.Message, "Expected a JSON string for date-time, but found Number."); + } + + [TestMethod] + public void NullableDateTimeRejectsDateOnlyValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"2024-01-02\"", _jsonSerializerOptions)); } [TestMethod] @@ -89,6 +119,39 @@ public void DateTimeDeserializesValidValue() DateTime actual = JsonSerializer.Deserialize("\"2024-01-02T03:04:05Z\"", _jsonSerializerOptions); Assert.AreEqual(new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc), actual); + Assert.AreEqual(DateTimeKind.Utc, actual.Kind); + } + + [TestMethod] + public void DateTimeDeserializesExtendedFractionalSeconds() + { + DateTime actual = JsonSerializer.Deserialize("\"2020-01-01T00:00:00.123456789Z\"", _jsonSerializerOptions); + + Assert.AreEqual(DateTimeKind.Utc, actual.Kind); + Assert.AreEqual(new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddTicks(1234567), actual); + } + + [TestMethod] + public void DateTimeNormalizesOffsetToUtc() + { + DateTime actual = JsonSerializer.Deserialize("\"2024-01-02T03:04:05+05:00\"", _jsonSerializerOptions); + + Assert.AreEqual(DateTimeKind.Utc, actual.Kind); + Assert.AreEqual(new DateTime(2024, 1, 1, 22, 4, 5, DateTimeKind.Utc), actual); + } + + [TestMethod] + public void DateTimeRejectsMissingTimeZone() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"2024-01-02T03:04:05\"", _jsonSerializerOptions)); + } + + [TestMethod] + public void DateTimeRejectsBasicFormat() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"20240102T030405Z\"", _jsonSerializerOptions)); } [TestMethod] @@ -101,15 +164,26 @@ public void DateTimeRejectsNull() [TestMethod] public void DateTimeRejectsInvalidValue() { - Assert.ThrowsException( + JsonException exception = Assert.ThrowsException( () => JsonSerializer.Deserialize("\"not-a-date\"", _jsonSerializerOptions)); + + StringAssert.Contains(exception.Message, "The JSON string is not a valid date-time."); } [TestMethod] public void DateTimeRejectsNonStringValue() { - Assert.ThrowsException( + JsonException exception = Assert.ThrowsException( () => JsonSerializer.Deserialize("123", _jsonSerializerOptions)); + + StringAssert.Contains(exception.Message, "Expected a JSON string for date-time, but found Number."); + } + + [TestMethod] + public void DateTimeRejectsDateOnlyValue() + { + Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"2024-01-02\"", _jsonSerializerOptions)); } [TestMethod] @@ -131,15 +205,19 @@ public void NullableDateOnlyDeserializesValidValue() [TestMethod] public void NullableDateOnlyRejectsInvalidValue() { - Assert.ThrowsException( + JsonException exception = Assert.ThrowsException( () => JsonSerializer.Deserialize("\"not-a-date\"", _jsonSerializerOptions)); + + StringAssert.Contains(exception.Message, "The JSON string is not a valid date."); } [TestMethod] public void NullableDateOnlyRejectsNonStringValue() { - Assert.ThrowsException( + JsonException exception = Assert.ThrowsException( () => JsonSerializer.Deserialize("123", _jsonSerializerOptions)); + + StringAssert.Contains(exception.Message, "Expected a JSON string for date, but found Number."); } [TestMethod] @@ -160,15 +238,26 @@ public void DateOnlyRejectsNull() [TestMethod] public void DateOnlyRejectsInvalidValue() { - Assert.ThrowsException( + JsonException exception = Assert.ThrowsException( () => JsonSerializer.Deserialize("\"not-a-date\"", _jsonSerializerOptions)); + + StringAssert.Contains(exception.Message, "The JSON string is not a valid date."); } [TestMethod] - public void DateOnlyRejectsNonStringValue() + public void DateOnlyRejectsBasicFormat() { Assert.ThrowsException( + () => JsonSerializer.Deserialize("\"20240102\"", _jsonSerializerOptions)); + } + + [TestMethod] + public void DateOnlyRejectsNonStringValue() + { + JsonException exception = Assert.ThrowsException( () => JsonSerializer.Deserialize("123", _jsonSerializerOptions)); + + StringAssert.Contains(exception.Message, "Expected a JSON string for date, but found Number."); } [TestMethod] diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 23b60f885ca9..a9d770eec078 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 3604f9543244..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index dd1413c6b666..ed43f4a40d07 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02c819724591..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index e581eb202123..e9b9e309a834 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString(); @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 898d073d622c..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 63ed74c36c48..c11d7360b76b 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index a1bc78148d09..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 23b60f885ca9..a9d770eec078 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 3604f9543244..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index dd1413c6b666..ed43f4a40d07 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02c819724591..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a0df38fc3a0f..3a15feabc8a6 100644 --- a/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 34e65f36aa3f..4479035069ce 100644 --- a/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net8/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 2b2239a87098..afc006d07d51 100644 --- a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 6de006b62ed3..a37df81ffaac 100644 --- a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 76226325c39d..1835da31d9d7 100644 --- a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index dbc6f0573cad..89a68bb80a48 100644 --- a/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AllOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index e581eb202123..e9b9e309a834 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString(); @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 898d073d622c..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 63ed74c36c48..c11d7360b76b 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index a1bc78148d09..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 23b60f885ca9..a9d770eec078 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 3604f9543244..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index dd1413c6b666..ed43f4a40d07 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02c819724591..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 6d06cee3e925..24d997ed5df8 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 941957b1fdb4..6e3e3be913c5 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a205b7dc2271..7d162bf3581a 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 0546f8625c4e..7023e86794bc 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index e581eb202123..e9b9e309a834 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString(); @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 898d073d622c..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index 63ed74c36c48..c11d7360b76b 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index a1bc78148d09..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs index 23b60f885ca9..a9d770eec078 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs @@ -24,8 +24,7 @@ public class DateOnlyJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -38,7 +37,7 @@ public class DateOnlyJsonConverter : JsonConverter /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException($"Expected a JSON string for date, but found {reader.TokenType}."); string value = reader.GetString()!; @@ -46,7 +45,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) return result; - throw new JsonException("The JSON value is not a valid date."); + throw new JsonException("The JSON string is not a valid date."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs index 3604f9543244..4e3414b475d8 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,15 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateOnlyNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd", - "yyyyMMdd" - - }; - /// /// Returns a DateOnly from the Json object /// @@ -40,16 +30,7 @@ public class DateOnlyNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result)) - return result; - - throw new JsonException("The JSON value is not a valid date."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -63,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonS if (dateOnlyValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateOnlyValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index dd1413c6b666..ed43f4a40d07 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,22 +24,6 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", }; @@ -52,15 +36,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 02c819724591..2376c19e2def 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,29 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - - }; - /// /// Returns a DateTime from the Json object /// @@ -54,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -77,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index a0df38fc3a0f..3a15feabc8a6 100644 --- a/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString()!; + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 34e65f36aa3f..4479035069ce 100644 --- a/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/net9/UseDateTimeForDate/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString()!; - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs index f7200a0cbf0f..43433df880d7 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs @@ -24,24 +24,7 @@ public class DateTimeJsonConverter : JsonConverter /// The formats used to deserialize the date /// public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" + "yyyy'-'MM'-'dd" }; @@ -54,15 +37,24 @@ public class DateTimeJsonConverter : JsonConverter /// public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException($"Expected a JSON string for date-time, but found {reader.TokenType}."); string value = reader.GetString(); + // Use System.Text.Json for standard ISO 8601 values with timezone information. + // System.Text.Json also accepts offset-less ISO 8601 values, but OpenAPI + // date-time values follow RFC 3339, which requires an offset. Let those + // non-standard values fall through so custom formats can explicitly permit them. + if (reader.TryGetDateTime(out DateTime dateTime) && dateTime.Kind != DateTimeKind.Unspecified) + return dateTime.ToUniversalTime(); + + // Use the customizable formats as a compatibility fallback for basic, + // date-only, and explicitly permitted offset-less values. foreach(string format in Formats) if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) return result; - throw new JsonException("The JSON value is not a valid date-time."); + throw new JsonException("The JSON string is not a valid date-time."); } /// diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs index 682ecc16fefc..f005882903c2 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs @@ -8,7 +8,6 @@ */ using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,31 +19,6 @@ namespace Org.OpenAPITools.Client /// public class DateTimeNullableJsonConverter : JsonConverter { - /// - /// The formats used to deserialize the date - /// - public static string[] Formats { get; } = { - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK", - "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - "yyyy'-'MM'-'dd", - "yyyyMMddTHHmmss.fffffffK", - "yyyyMMddTHHmmss.ffffffK", - "yyyyMMddTHHmmss.fffffK", - "yyyyMMddTHHmmss.ffffK", - "yyyyMMddTHHmmss.fffK", - "yyyyMMddTHHmmss.ffK", - "yyyyMMddTHHmmss.fK", - "yyyyMMddTHHmmssK", - "yyyyMMdd" - - }; - /// /// Returns a DateTime from the Json object /// @@ -56,16 +30,7 @@ public class DateTimeNullableJsonConverter : JsonConverter if (reader.TokenType == JsonTokenType.Null) return null; - if (reader.TokenType != JsonTokenType.String) - throw new JsonException("The JSON value is not a valid date-time."); - - string value = reader.GetString(); - - foreach(string format in Formats) - if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result)) - return result; - - throw new JsonException("The JSON value is not a valid date-time."); + return JsonSerializer.Deserialize(ref reader, options); } /// @@ -79,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonS if (dateTimeValue == null) writer.WriteNullValue(); else - writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture)); + JsonSerializer.Serialize(writer, dateTimeValue.Value, options); } } }