From 66a1880a580b25db7add41ed3947166b10415f37 Mon Sep 17 00:00:00 2001 From: crobibero Date: Sun, 6 Dec 2020 20:26:21 -0700 Subject: [PATCH 1/2] Add number to bool json converter --- .../TunerHosts/HdHomerun/HdHomerunHost.cs | 4 +++ .../Converters/JsonBoolNumberConverter.cs | 33 +++++++++++++++++++ .../Json/JsonBoolNumberTests.cs | 23 +++++++++++++ .../Models/BoolTypeModel.cs | 17 ++++++++++ 4 files changed, 77 insertions(+) create mode 100644 MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs create mode 100644 tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs create mode 100644 tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs index b6444b172a..0f296d9894 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs @@ -8,10 +8,12 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Json.Converters; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; @@ -340,8 +342,10 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun public string URL { get; set; } + [JsonConverter(typeof(JsonBoolNumberConverter))] public bool Favorite { get; set; } + [JsonConverter(typeof(JsonBoolNumberConverter))] public bool DRM { get; set; } public int HD { get; set; } diff --git a/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs b/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs new file mode 100644 index 0000000000..f73ca344ca --- /dev/null +++ b/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MediaBrowser.Common.Json.Converters +{ + /// + /// Converts a number to a boolean. + /// This is needed for HDHomerun. + /// + /// + /// Adding this to the JsonConverter list causes recursion. + /// + public class JsonBoolNumberConverter : JsonConverter + { + /// + public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Number) + { + return Convert.ToBoolean(reader.GetInt32()); + } + + return JsonSerializer.Deserialize(ref reader, options); + } + + /// + public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) + { + JsonSerializer.Serialize(writer, value, options); + } + } +} \ No newline at end of file diff --git a/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs b/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs new file mode 100644 index 0000000000..1cae5b8491 --- /dev/null +++ b/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs @@ -0,0 +1,23 @@ +using System.Text.Json; +using Jellyfin.Common.Tests.Models; +using Xunit; + +namespace Jellyfin.Common.Tests.Json +{ + public static class JsonBoolNumberTests + { + [Theory] + [InlineData("1", true)] + [InlineData("0", false)] + [InlineData("2", true)] + [InlineData("true", true)] + [InlineData("false", false)] + public static void Deserialize_Number_Valid_Success(string input, bool? output) + { + var inputJson = $"{{ \"Value\": {input} }}"; + var options = new JsonSerializerOptions(); + var value = JsonSerializer.Deserialize(inputJson, options); + Assert.Equal(value?.Value, output); + } + } +} \ No newline at end of file diff --git a/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs b/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs new file mode 100644 index 0000000000..feb952efc5 --- /dev/null +++ b/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs @@ -0,0 +1,17 @@ +using System.Text.Json.Serialization; +using MediaBrowser.Common.Json.Converters; + +namespace Jellyfin.Common.Tests.Models +{ + /// + /// The bool type model. + /// + public class BoolTypeModel + { + /// + /// Gets or sets a value indicating whether the value is true or false. + /// + [JsonConverter(typeof(JsonBoolNumberConverter))] + public bool Value { get; set; } + } +} \ No newline at end of file From 6e9837844738de7bc55dae9994538535e62ed888 Mon Sep 17 00:00:00 2001 From: crobibero Date: Mon, 7 Dec 2020 14:58:27 -0700 Subject: [PATCH 2/2] Simplify converter --- .../Json/Converters/JsonBoolNumberConverter.cs | 5 +---- MediaBrowser.Common/Json/JsonDefaults.cs | 1 + .../Json/JsonBoolNumberTests.cs | 8 ++++---- .../Models/BoolTypeModel.cs | 17 ----------------- 4 files changed, 6 insertions(+), 25 deletions(-) delete mode 100644 tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs diff --git a/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs b/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs index f73ca344ca..cb2047049e 100644 --- a/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs +++ b/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs @@ -8,9 +8,6 @@ namespace MediaBrowser.Common.Json.Converters /// Converts a number to a boolean. /// This is needed for HDHomerun. /// - /// - /// Adding this to the JsonConverter list causes recursion. - /// public class JsonBoolNumberConverter : JsonConverter { /// @@ -21,7 +18,7 @@ namespace MediaBrowser.Common.Json.Converters return Convert.ToBoolean(reader.GetInt32()); } - return JsonSerializer.Deserialize(ref reader, options); + return reader.GetBoolean(); } /// diff --git a/MediaBrowser.Common/Json/JsonDefaults.cs b/MediaBrowser.Common/Json/JsonDefaults.cs index c5050a21db..b76edd2bc7 100644 --- a/MediaBrowser.Common/Json/JsonDefaults.cs +++ b/MediaBrowser.Common/Json/JsonDefaults.cs @@ -43,6 +43,7 @@ namespace MediaBrowser.Common.Json options.Converters.Add(new JsonVersionConverter()); options.Converters.Add(new JsonStringEnumConverter()); options.Converters.Add(new JsonNullableStructConverterFactory()); + options.Converters.Add(new JsonBoolNumberConverter()); return options; } diff --git a/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs b/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs index 1cae5b8491..3779e2d0ae 100644 --- a/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs +++ b/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs @@ -1,5 +1,5 @@ using System.Text.Json; -using Jellyfin.Common.Tests.Models; +using MediaBrowser.Common.Json.Converters; using Xunit; namespace Jellyfin.Common.Tests.Json @@ -14,10 +14,10 @@ namespace Jellyfin.Common.Tests.Json [InlineData("false", false)] public static void Deserialize_Number_Valid_Success(string input, bool? output) { - var inputJson = $"{{ \"Value\": {input} }}"; var options = new JsonSerializerOptions(); - var value = JsonSerializer.Deserialize(inputJson, options); - Assert.Equal(value?.Value, output); + options.Converters.Add(new JsonBoolNumberConverter()); + var value = JsonSerializer.Deserialize(input, options); + Assert.Equal(value, output); } } } \ No newline at end of file diff --git a/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs b/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs deleted file mode 100644 index feb952efc5..0000000000 --- a/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Text.Json.Serialization; -using MediaBrowser.Common.Json.Converters; - -namespace Jellyfin.Common.Tests.Models -{ - /// - /// The bool type model. - /// - public class BoolTypeModel - { - /// - /// Gets or sets a value indicating whether the value is true or false. - /// - [JsonConverter(typeof(JsonBoolNumberConverter))] - public bool Value { get; set; } - } -} \ No newline at end of file