diff options
| author | Cody Robibero <cody@robibe.ro> | 2020-06-20 15:33:13 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-06-20 15:33:13 -0600 |
| commit | 43221fc26b46ac8d55b8bac7cec859dc8ec3883b (patch) | |
| tree | be1fbaf44475fc5aa21df24ac8e5f3cf05abc7c9 /MediaBrowser.Common/Json/Converters/JsonNonStringKeyDictionaryConverterFactory.cs | |
| parent | 46006a1aff5759e9843813a9d31dc79672af71d5 (diff) | |
| parent | bb947718eaee3a8381d9b9e6ed926676de39d7c9 (diff) | |
Merge branch 'master' into SSDP
Diffstat (limited to 'MediaBrowser.Common/Json/Converters/JsonNonStringKeyDictionaryConverterFactory.cs')
| -rw-r--r-- | MediaBrowser.Common/Json/Converters/JsonNonStringKeyDictionaryConverterFactory.cs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/MediaBrowser.Common/Json/Converters/JsonNonStringKeyDictionaryConverterFactory.cs b/MediaBrowser.Common/Json/Converters/JsonNonStringKeyDictionaryConverterFactory.cs new file mode 100644 index 000000000..52f360740 --- /dev/null +++ b/MediaBrowser.Common/Json/Converters/JsonNonStringKeyDictionaryConverterFactory.cs @@ -0,0 +1,59 @@ +#nullable enable + +using System; +using System.Collections; +using System.Globalization; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MediaBrowser.Common.Json.Converters +{ + /// <summary> + /// https://github.com/dotnet/runtime/issues/30524#issuecomment-524619972. + /// TODO This can be removed when System.Text.Json supports Dictionaries with non-string keys. + /// </summary> + internal sealed class JsonNonStringKeyDictionaryConverterFactory : JsonConverterFactory + { + /// <summary> + /// Only convert objects that implement IDictionary and do not have string keys. + /// </summary> + /// <param name="typeToConvert">Type convert.</param> + /// <returns>Conversion ability.</returns> + public override bool CanConvert(Type typeToConvert) + { + if (!typeToConvert.IsGenericType) + { + return false; + } + + // Let built in converter handle string keys + if (typeToConvert.GenericTypeArguments[0] == typeof(string)) + { + return false; + } + + // Only support objects that implement IDictionary + return typeToConvert.GetInterface(nameof(IDictionary)) != null; + } + + /// <summary> + /// Create converter for generic dictionary type. + /// </summary> + /// <param name="typeToConvert">Type to convert.</param> + /// <param name="options">Json serializer options.</param> + /// <returns>JsonConverter for given type.</returns> + public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) + { + var converterType = typeof(JsonNonStringKeyDictionaryConverter<,>) + .MakeGenericType(typeToConvert.GenericTypeArguments[0], typeToConvert.GenericTypeArguments[1]); + var converter = (JsonConverter)Activator.CreateInstance( + converterType, + BindingFlags.Instance | BindingFlags.Public, + null, + null, + CultureInfo.CurrentCulture); + return converter; + } + } +} |
