diff --git a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs index aa711e8f..aeb533e9 100644 --- a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs @@ -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 diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 987b2f8f..9e208a9f 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -6496,6 +6496,33 @@ Parameter name: value", var actual = JsonConvert.DeserializeObject(@"{ ""MyProperty"":{""Key"":""Y""}}"); Assert.AreEqual("X", actual.MyProperty["Key"]); } + + [Test] + public void DeserializeCaseInsensitiveKeyValuePairConverter() + { + KeyValuePair result = + JsonConvert.DeserializeObject>( + "{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(123, "test value"), Formatting.Indented, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + + Assert.AreEqual(@"{ + ""key"": 123, + ""value"": ""test value"" +}", json); + } } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) diff --git a/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs b/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs index 7e6b6d31..17f210ea 100644 --- a/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs +++ b/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs @@ -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 /// public class KeyValuePairConverter : JsonConverter { + private const string KeyName = "Key"; + private const string ValueName = "Value"; + /// /// Writes the JSON representation of the object. /// @@ -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(); diff --git a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs index 0480a78a..07dac1c7 100644 --- a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs @@ -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)]