|
@@ -1,82 +0,0 @@
|
|
|
-#nullable enable
|
|
|
-
|
|
|
-using System;
|
|
|
-using System.Collections;
|
|
|
-using System.Collections.Generic;
|
|
|
-using System.Globalization;
|
|
|
-using System.Reflection;
|
|
|
-using System.Text.Json;
|
|
|
-using System.Text.Json.Serialization;
|
|
|
-
|
|
|
-namespace MediaBrowser.Common.Json.Converters
|
|
|
-{
|
|
|
- /// <summary>
|
|
|
- /// Converter for Dictionaries without string key.
|
|
|
- /// TODO This can be removed when System.Text.Json supports Dictionaries with non-string keys.
|
|
|
- /// </summary>
|
|
|
- /// <typeparam name="TKey">Type of key.</typeparam>
|
|
|
- /// <typeparam name="TValue">Type of value.</typeparam>
|
|
|
- internal sealed class JsonNonStringKeyDictionaryConverter<TKey, TValue> : JsonConverter<IDictionary<TKey, TValue>>
|
|
|
- {
|
|
|
- /// <summary>
|
|
|
- /// Read JSON.
|
|
|
- /// </summary>
|
|
|
- /// <param name="reader">The Utf8JsonReader.</param>
|
|
|
- /// <param name="typeToConvert">The type to convert.</param>
|
|
|
- /// <param name="options">The json serializer options.</param>
|
|
|
- /// <returns>Typed dictionary.</returns>
|
|
|
- /// <exception cref="NotSupportedException">Dictionary key type not supported.</exception>
|
|
|
- public override IDictionary<TKey, TValue> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
|
- {
|
|
|
- var convertedType = typeof(Dictionary<,>).MakeGenericType(typeof(string), typeToConvert.GenericTypeArguments[1]);
|
|
|
- var value = JsonSerializer.Deserialize(ref reader, convertedType, options);
|
|
|
- var instance = (Dictionary<TKey, TValue>)Activator.CreateInstance(
|
|
|
- typeToConvert,
|
|
|
- BindingFlags.Instance | BindingFlags.Public,
|
|
|
- null,
|
|
|
- null,
|
|
|
- CultureInfo.CurrentCulture);
|
|
|
- var enumerator = (IEnumerator)convertedType.GetMethod("GetEnumerator")!.Invoke(value, null);
|
|
|
- var parse = typeof(TKey).GetMethod(
|
|
|
- "Parse",
|
|
|
- 0,
|
|
|
- BindingFlags.Public | BindingFlags.Static,
|
|
|
- null,
|
|
|
- CallingConventions.Any,
|
|
|
- new[] { typeof(string) },
|
|
|
- null);
|
|
|
- if (parse == null)
|
|
|
- {
|
|
|
- throw new NotSupportedException($"{typeof(TKey)} as TKey in IDictionary<TKey, TValue> is not supported.");
|
|
|
- }
|
|
|
-
|
|
|
- while (enumerator.MoveNext())
|
|
|
- {
|
|
|
- var element = (KeyValuePair<string?, TValue>)enumerator.Current;
|
|
|
- instance.Add((TKey)parse.Invoke(null, new[] { (object?)element.Key }), element.Value);
|
|
|
- }
|
|
|
-
|
|
|
- return instance;
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Write dictionary as Json.
|
|
|
- /// </summary>
|
|
|
- /// <param name="writer">The Utf8JsonWriter.</param>
|
|
|
- /// <param name="value">The dictionary value.</param>
|
|
|
- /// <param name="options">The Json serializer options.</param>
|
|
|
- public override void Write(Utf8JsonWriter writer, IDictionary<TKey, TValue> value, JsonSerializerOptions options)
|
|
|
- {
|
|
|
- var convertedDictionary = new Dictionary<string?, TValue>(value.Count);
|
|
|
- foreach (var (k, v) in value)
|
|
|
- {
|
|
|
- if (k != null)
|
|
|
- {
|
|
|
- convertedDictionary[k.ToString()] = v;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- JsonSerializer.Serialize(writer, convertedDictionary, options);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|