Code Coverage Statistics for Source File
Newtonsoft.Json\Converters\KeyValuePairConverter.cs
Symbol Coverage: 100.00% (26 of 26)
Branch Coverage: 100.00% (7 of 7)
Cyclomatic Complexity Avg: 1.50 Max:3
Code Lines: 26
Symbol Coverage Trend
View:
L | V | Source |
---|---|---|
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 |
4 |
Type t = value.GetType();
|
24 |
4 |
PropertyInfo keyProperty = t.GetProperty("Key");
|
25 |
4 |
PropertyInfo valueProperty = t.GetProperty("Value");
|
26 |
||
27 |
4 |
writer.WriteStartObject();
|
28 |
4 |
writer.WritePropertyName("Key");
|
29 |
4 |
serializer.Serialize(writer, ReflectionUtils.GetMemberValue(keyProperty, value));
|
30 |
4 |
writer.WritePropertyName("Value");
|
31 |
4 |
serializer.Serialize(writer, ReflectionUtils.GetMemberValue(valueProperty, value));
|
32 |
4 |
writer.WriteEndObject();
|
33 |
4 |
}
|
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 |
4 |
IList<Type> genericArguments = objectType.GetGenericArguments();
|
46 |
4 |
Type keyType = genericArguments[0];
|
47 |
4 |
Type valueType = genericArguments[1];
|
48 |
||
49 |
4 |
reader.Read();
|
50 |
4 |
reader.Read();
|
51 |
4 |
object key = serializer.Deserialize(reader, keyType);
|
52 |
4 |
reader.Read();
|
53 |
4 |
reader.Read();
|
54 |
4 |
object value = serializer.Deserialize(reader, valueType);
|
55 |
4 |
reader.Read();
|
56 |
||
57 |
4 |
return ReflectionUtils.CreateInstance(objectType, key, value);
|
58 |
4 |
}
|
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 |
305 |
if (objectType.IsValueType && objectType.IsGenericType)
|
70 |
9 |
return (objectType.GetGenericTypeDefinition() == typeof (KeyValuePair<,>));
|
71 |
||
72 |
296 |
return false;
|
73 |
305 |
}
|
74 |
} |
|
75 |
} |