All files
[pithos-ms-client] / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json / Converters / KeyValuePairConverter.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Newtonsoft.Json.Utilities;
6 using System.Reflection;
7
8 namespace Newtonsoft.Json.Converters
9 {
10   /// <summary>
11   /// Converts a <see cref="KeyValuePair{TKey,TValue}"/> to and from JSON.
12   /// </summary>
13   public class KeyValuePairConverter : JsonConverter
14   {
15     /// <summary>
16     /// Writes the JSON representation of the object.
17     /// </summary>
18     /// <param name="writer">The <see cref="JsonWriter"/> to write to.</param>
19     /// <param name="value">The value.</param>
20     /// <param name="serializer">The calling serializer.</param>
21     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
22     {
23       Type t = value.GetType();
24       PropertyInfo keyProperty = t.GetProperty("Key");
25       PropertyInfo valueProperty = t.GetProperty("Value");
26
27       writer.WriteStartObject();
28       writer.WritePropertyName("Key");
29       serializer.Serialize(writer, ReflectionUtils.GetMemberValue(keyProperty, value));
30       writer.WritePropertyName("Value");
31       serializer.Serialize(writer, ReflectionUtils.GetMemberValue(valueProperty, value));
32       writer.WriteEndObject();
33     }
34
35     /// <summary>
36     /// Reads the JSON representation of the object.
37     /// </summary>
38     /// <param name="reader">The <see cref="JsonReader"/> to read from.</param>
39     /// <param name="objectType">Type of the object.</param>
40     /// <param name="existingValue">The existing value of object being read.</param>
41     /// <param name="serializer">The calling serializer.</param>
42     /// <returns>The object value.</returns>
43     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
44     {
45       IList<Type> genericArguments = objectType.GetGenericArguments();
46       Type keyType = genericArguments[0];
47       Type valueType = genericArguments[1];
48
49       reader.Read();
50       reader.Read();
51       object key = serializer.Deserialize(reader, keyType);
52       reader.Read();
53       reader.Read();
54       object value = serializer.Deserialize(reader, valueType);
55       reader.Read();
56
57       return ReflectionUtils.CreateInstance(objectType, key, value);
58     }
59
60     /// <summary>
61     /// Determines whether this instance can convert the specified object type.
62     /// </summary>
63     /// <param name="objectType">Type of the object.</param>
64     /// <returns>
65     ///         <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
66     /// </returns>
67     public override bool CanConvert(Type objectType)
68     {
69       if (objectType.IsValueType && objectType.IsGenericType)
70         return (objectType.GetGenericTypeDefinition() == typeof (KeyValuePair<,>));
71
72       return false;
73     }
74   }
75 }