<PackageReference Include="Newtonsoft.Json" Version="10.0.2" />

KeyValuePairConverter

Converts a KeyValuePair<T, U> to and from JSON.
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; using System; using System.Collections.Generic; namespace Newtonsoft.Json.Converters { public class KeyValuePairConverter : JsonConverter { private const string KeyName = "Key"; private const string ValueName = "Value"; private static readonly ThreadSafeStore<Type, ReflectionObject> ReflectionObjectPerType = new ThreadSafeStore<Type, ReflectionObject>(InitializeReflectionObject); private static ReflectionObject InitializeReflectionObject(Type t) { Type[] genericArguments = TypeExtensions.GetGenericArguments(t); Type type = ((IList<Type>)genericArguments)[0]; Type type2 = ((IList<Type>)genericArguments)[1]; return ReflectionObject.Create(t, TypeExtensions.GetConstructor(t, new Type[2] { type, type2 }), "Key", "Value"); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { ReflectionObject reflectionObject = ReflectionObjectPerType.Get(value.GetType()); DefaultContractResolver defaultContractResolver = serializer.ContractResolver as DefaultContractResolver; writer.WriteStartObject(); writer.WritePropertyName((defaultContractResolver != null) ? defaultContractResolver.GetResolvedPropertyName("Key") : "Key"); serializer.Serialize(writer, reflectionObject.GetValue(value, "Key"), reflectionObject.GetType("Key")); writer.WritePropertyName((defaultContractResolver != null) ? defaultContractResolver.GetResolvedPropertyName("Value") : "Value"); serializer.Serialize(writer, reflectionObject.GetValue(value, "Value"), reflectionObject.GetType("Value")); writer.WriteEndObject(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { if (!ReflectionUtils.IsNullableType(objectType)) throw JsonSerializationException.Create(reader, "Cannot convert null value to KeyValuePair."); return null; } object obj = null; object obj2 = null; reader.ReadAndAssert(); Type key = ReflectionUtils.IsNullableType(objectType) ? Nullable.GetUnderlyingType(objectType) : objectType; ReflectionObject reflectionObject = ReflectionObjectPerType.Get(key); while (reader.TokenType == JsonToken.PropertyName) { string a = reader.Value.ToString(); if (string.Equals(a, "Key", StringComparison.OrdinalIgnoreCase)) { reader.ReadAndAssert(); obj = serializer.Deserialize(reader, reflectionObject.GetType("Key")); } else if (string.Equals(a, "Value", StringComparison.OrdinalIgnoreCase)) { reader.ReadAndAssert(); obj2 = serializer.Deserialize(reader, reflectionObject.GetType("Value")); } else { reader.Skip(); } reader.ReadAndAssert(); } return reflectionObject.Creator(obj, obj2); } public override bool CanConvert(Type objectType) { Type type = ReflectionUtils.IsNullableType(objectType) ? Nullable.GetUnderlyingType(objectType) : objectType; if (type.IsValueType() && type.IsGenericType()) return (object)type.GetGenericTypeDefinition() == typeof(KeyValuePair<, >); return false; } } }