using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json.Utilities; using System.Reflection; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from JSON. /// public class KeyValuePairConverter : JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { Type t = value.GetType(); PropertyInfo keyProperty = t.GetProperty("Key"); PropertyInfo valueProperty = t.GetProperty("Value"); writer.WriteStartObject(); writer.WritePropertyName("Key"); serializer.Serialize(writer, ReflectionUtils.GetMemberValue(keyProperty, value)); writer.WritePropertyName("Value"); serializer.Serialize(writer, ReflectionUtils.GetMemberValue(valueProperty, value)); writer.WriteEndObject(); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { IList genericArguments = objectType.GetGenericArguments(); Type keyType = genericArguments[0]; Type valueType = genericArguments[1]; reader.Read(); reader.Read(); object key = serializer.Deserialize(reader, keyType); reader.Read(); reader.Read(); object value = serializer.Deserialize(reader, valueType); reader.Read(); return ReflectionUtils.CreateInstance(objectType, key, value); } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { if (objectType.IsValueType && objectType.IsGenericType) return (objectType.GetGenericTypeDefinition() == typeof (KeyValuePair<,>)); return false; } } }