-Fixed KeyValuePair case insensitive deserializing

-Fixed KeyValuePair not using contract resolver for property names when serializing
This commit is contained in:
James Newton-King
2012-06-30 12:39:39 +12:00
parent fe200fbaeb
commit 737f490cac
4 changed files with 53 additions and 18 deletions
@@ -72,5 +72,5 @@ using System.Security;
// by using the '*' as shown below:
[assembly: AssemblyVersion("4.5.0.0")]
#if !PocketPC
[assembly: AssemblyFileVersion("4.5.6.15009")]
[assembly: AssemblyFileVersion("4.5.7.15030")]
#endif
@@ -6496,6 +6496,33 @@ Parameter name: value",
var actual = JsonConvert.DeserializeObject<MyType>(@"{ ""MyProperty"":{""Key"":""Y""}}");
Assert.AreEqual("X", actual.MyProperty["Key"]);
}
[Test]
public void DeserializeCaseInsensitiveKeyValuePairConverter()
{
KeyValuePair<int, string> result =
JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
"{key: 123, \"VALUE\": \"test value\"}"
);
Assert.AreEqual(123, result.Key);
Assert.AreEqual("test value", result.Value);
}
[Test]
public void SerializeKeyValuePairConverterWithCamelCase()
{
string json =
JsonConvert.SerializeObject(new KeyValuePair<int, string>(123, "test value"), Formatting.Indented, new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
Assert.AreEqual(@"{
""key"": 123,
""value"": ""test value""
}", json);
}
}
#if !(SILVERLIGHT || NETFX_CORE || PORTABLE)
@@ -25,6 +25,7 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Utilities;
using System.Reflection;
@@ -35,6 +36,9 @@ namespace Newtonsoft.Json.Converters
/// </summary>
public class KeyValuePairConverter : JsonConverter
{
private const string KeyName = "Key";
private const string ValueName = "Value";
/// <summary>
/// Writes the JSON representation of the object.
/// </summary>
@@ -44,13 +48,16 @@ namespace Newtonsoft.Json.Converters
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Type t = value.GetType();
PropertyInfo keyProperty = t.GetProperty("Key");
PropertyInfo valueProperty = t.GetProperty("Value");
PropertyInfo keyProperty = t.GetProperty(KeyName);
PropertyInfo valueProperty = t.GetProperty(ValueName);
DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver;
writer.WriteStartObject();
writer.WritePropertyName("Key");
writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(KeyName) : KeyName);
serializer.Serialize(writer, ReflectionUtils.GetMemberValue(keyProperty, value));
writer.WritePropertyName("Value");
writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(ValueName) : ValueName);
serializer.Serialize(writer, ReflectionUtils.GetMemberValue(valueProperty, value));
writer.WriteEndObject();
}
@@ -90,19 +97,20 @@ namespace Newtonsoft.Json.Converters
while (reader.TokenType == JsonToken.PropertyName)
{
switch (reader.Value.ToString())
string propertyName = reader.Value.ToString();
if (string.Equals(propertyName, KeyName, StringComparison.OrdinalIgnoreCase))
{
case "Key":
reader.Read();
key = serializer.Deserialize(reader, keyType);
break;
case "Value":
reader.Read();
value = serializer.Deserialize(reader, valueType);
break;
default:
reader.Skip();
break;
reader.Read();
key = serializer.Deserialize(reader, keyType);
}
else if (string.Equals(propertyName, ValueName, StringComparison.OrdinalIgnoreCase))
{
reader.Read();
value = serializer.Deserialize(reader, valueType);
}
else
{
reader.Skip();
}
reader.Read();
@@ -90,7 +90,7 @@ using System.Security;
// by using the '*' as shown below:
[assembly: AssemblyVersion("4.5.0.0")]
#if !PocketPC
[assembly: AssemblyFileVersion("4.5.6.15009")]
[assembly: AssemblyFileVersion("4.5.7.15030")]
#endif
[assembly: CLSCompliant(true)]