From 7140c60bea937731d330f7f90b407cd87523ebf6 Mon Sep 17 00:00:00 2001 From: devsko Date: Wed, 26 Aug 2020 23:04:52 +0200 Subject: [PATCH] Added VersionConverter (#41384) * Added VersionConverter * Nullable annotation --- .../System.Text.Json/src/System.Text.Json.csproj | 1 + .../Converters/Value/VersionConverter.cs | 25 ++++++++++++++++++++++ .../JsonSerializerOptions.Converters.cs | 3 ++- .../tests/Serialization/Value.ReadTests.cs | 21 ++++++++++++++++++ .../tests/Serialization/Value.WriteTests.cs | 15 +++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/VersionConverter.cs diff --git a/src/libraries/System.Text.Json/src/System.Text.Json.csproj b/src/libraries/System.Text.Json/src/System.Text.Json.csproj index fc5c8ce..1b7f070 100644 --- a/src/libraries/System.Text.Json/src/System.Text.Json.csproj +++ b/src/libraries/System.Text.Json/src/System.Text.Json.csproj @@ -125,6 +125,7 @@ + diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/VersionConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/VersionConverter.cs new file mode 100644 index 0000000..64f4986 --- /dev/null +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/VersionConverter.cs @@ -0,0 +1,25 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace System.Text.Json.Serialization.Converters +{ + internal sealed class VersionConverter : JsonConverter + { + public override Version Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + string? versionString = reader.GetString(); + if (Version.TryParse(versionString, out Version? result)) + { + return result; + } + + ThrowHelper.ThrowJsonException(); + return null; + } + + public override void Write(Utf8JsonWriter writer, Version value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString()); + } + } +} diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs index 9a442a2..8d0c4f1 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs @@ -35,7 +35,7 @@ namespace System.Text.Json private static Dictionary GetDefaultSimpleConverters() { - const int NumberOfSimpleConverters = 23; + const int NumberOfSimpleConverters = 24; var converters = new Dictionary(NumberOfSimpleConverters); // Use a dictionary for simple converters. @@ -63,6 +63,7 @@ namespace System.Text.Json Add(new UInt32Converter()); Add(new UInt64Converter()); Add(new UriConverter()); + Add(new VersionConverter()); Debug.Assert(NumberOfSimpleConverters == converters.Count); diff --git a/src/libraries/System.Text.Json/tests/Serialization/Value.ReadTests.cs b/src/libraries/System.Text.Json/tests/Serialization/Value.ReadTests.cs index 36d0ec3..b4a8d0d 100644 --- a/src/libraries/System.Text.Json/tests/Serialization/Value.ReadTests.cs +++ b/src/libraries/System.Text.Json/tests/Serialization/Value.ReadTests.cs @@ -122,6 +122,7 @@ namespace System.Text.Json.Serialization.Tests [InlineData(typeof(uint))] [InlineData(typeof(ulong))] [InlineData(typeof(Uri))] + [InlineData(typeof(Version))] public static void PrimitivesShouldFailWithArrayOrObjectAssignment(Type primitiveType) { // This test lines up with the built in JsonConverters @@ -312,6 +313,26 @@ namespace System.Text.Json.Serialization.Tests } [Fact] + public static void ReadVersion() + { + Version version; + + version = JsonSerializer.Deserialize(@"""1.2"""); + Assert.Equal(new Version(1, 2), version); + + version = JsonSerializer.Deserialize(@"""1.2.3"""); + Assert.Equal(new Version(1, 2, 3), version); + + version = JsonSerializer.Deserialize(@"""1.2.3.4"""); + Assert.Equal(new Version(1, 2, 3, 4), version); + + version = JsonSerializer.Deserialize("null"); + Assert.Null(version); + + Assert.Throws(() => JsonSerializer.Deserialize(@"""""")); + } + + [Fact] public static void ReadPrimitiveUri() { Uri uri = JsonSerializer.Deserialize(@"""https://domain/path"""); diff --git a/src/libraries/System.Text.Json/tests/Serialization/Value.WriteTests.cs b/src/libraries/System.Text.Json/tests/Serialization/Value.WriteTests.cs index f4979d3..210cc6f 100644 --- a/src/libraries/System.Text.Json/tests/Serialization/Value.WriteTests.cs +++ b/src/libraries/System.Text.Json/tests/Serialization/Value.WriteTests.cs @@ -96,6 +96,21 @@ namespace System.Text.Json.Serialization.Tests Uri uri = new Uri("http://localhost?p1=Value&p2=A%20B%26p3%3DFooled!"); Assert.Equal(@"""http://localhost?p1=Value\u0026p2=A%20B%26p3%3DFooled!""", JsonSerializer.Serialize(uri)); } + + { + Version version = new Version(1, 2); + Assert.Equal(@"""1.2""", JsonSerializer.Serialize(version)); + } + + { + Version version = new Version(1, 2, 3); + Assert.Equal(@"""1.2.3""", JsonSerializer.Serialize(version)); + } + + { + Version version = new Version(1, 2, 3, 4); + Assert.Equal(@"""1.2.3.4""", JsonSerializer.Serialize(version)); + } } } } -- 2.7.4