1 #region License 2 // Copyright (c) 2007 James Newton-King 3 // 4 // Permission is hereby granted, free of charge, to any person 5 // obtaining a copy of this software and associated documentation 6 // files (the "Software"), to deal in the Software without 7 // restriction, including without limitation the rights to use, 8 // copy, modify, merge, publish, distribute, sublicense, and/or sell 9 // copies of the Software, and to permit persons to whom the 10 // Software is furnished to do so, subject to the following 11 // conditions: 12 // 13 // The above copyright notice and this permission notice shall be 14 // included in all copies or substantial portions of the Software. 15 // 16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 // OTHER DEALINGS IN THE SOFTWARE. 24 #endregion 25 26 using System; 27 using System.Collections.Generic; 28 using Newtonsoft.Json.Serialization; 29 #if NETFX_CORE 30 using Microsoft.VisualStudio.TestPlatform.UnitTestFramework; 31 using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute; 32 using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute; 33 #elif DNXCORE50 34 using Xunit; 35 using Test = Xunit.FactAttribute; 36 using Assert = Newtonsoft.Json.Tests.XUnitAssert; 37 #else 38 using NUnit.Framework; 39 #endif 40 using Newtonsoft.Json.Tests.TestObjects; 41 using Newtonsoft.Json.Linq; 42 using System.Reflection; 43 using Newtonsoft.Json.Utilities; 44 45 namespace Newtonsoft.Json.Tests.Serialization 46 { 47 [TestFixture] 48 public class CamelCasePropertyNamesContractResolverTests : TestFixtureBase 49 { 50 [Test] JsonConvertSerializerSettings()51 public void JsonConvertSerializerSettings() 52 { 53 Person person = new Person(); 54 person.BirthDate = new DateTime(2000, 11, 20, 23, 55, 44, DateTimeKind.Utc); 55 person.LastModified = new DateTime(2000, 11, 20, 23, 55, 44, DateTimeKind.Utc); 56 person.Name = "Name!"; 57 58 string json = JsonConvert.SerializeObject(person, Formatting.Indented, new JsonSerializerSettings 59 { 60 ContractResolver = new CamelCasePropertyNamesContractResolver() 61 }); 62 63 StringAssert.AreEqual(@"{ 64 ""name"": ""Name!"", 65 ""birthDate"": ""2000-11-20T23:55:44Z"", 66 ""lastModified"": ""2000-11-20T23:55:44Z"" 67 }", json); 68 69 Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json, new JsonSerializerSettings 70 { 71 ContractResolver = new CamelCasePropertyNamesContractResolver() 72 }); 73 74 Assert.AreEqual(person.BirthDate, deserializedPerson.BirthDate); 75 Assert.AreEqual(person.LastModified, deserializedPerson.LastModified); 76 Assert.AreEqual(person.Name, deserializedPerson.Name); 77 78 json = JsonConvert.SerializeObject(person, Formatting.Indented); 79 StringAssert.AreEqual(@"{ 80 ""Name"": ""Name!"", 81 ""BirthDate"": ""2000-11-20T23:55:44Z"", 82 ""LastModified"": ""2000-11-20T23:55:44Z"" 83 }", json); 84 } 85 86 [Test] JTokenWriter()87 public void JTokenWriter() 88 { 89 JsonIgnoreAttributeOnClassTestClass ignoreAttributeOnClassTestClass = new JsonIgnoreAttributeOnClassTestClass(); 90 ignoreAttributeOnClassTestClass.Field = int.MinValue; 91 92 JsonSerializer serializer = new JsonSerializer(); 93 serializer.ContractResolver = new CamelCasePropertyNamesContractResolver(); 94 95 JTokenWriter writer = new JTokenWriter(); 96 97 serializer.Serialize(writer, ignoreAttributeOnClassTestClass); 98 99 JObject o = (JObject)writer.Token; 100 JProperty p = o.Property("theField"); 101 102 Assert.IsNotNull(p); 103 Assert.AreEqual(int.MinValue, (int)p.Value); 104 105 string json = o.ToString(); 106 } 107 108 #if !(NETFX_CORE || PORTABLE || PORTABLE40) 109 #pragma warning disable 618 110 [Test] MemberSearchFlags()111 public void MemberSearchFlags() 112 { 113 PrivateMembersClass privateMembersClass = new PrivateMembersClass("PrivateString!", "InternalString!"); 114 115 string json = JsonConvert.SerializeObject(privateMembersClass, Formatting.Indented, new JsonSerializerSettings 116 { 117 ContractResolver = new CamelCasePropertyNamesContractResolver { DefaultMembersSearchFlags = BindingFlags.NonPublic | BindingFlags.Instance } 118 }); 119 120 StringAssert.AreEqual(@"{ 121 ""_privateString"": ""PrivateString!"", 122 ""i"": 0, 123 ""_internalString"": ""InternalString!"" 124 }", json); 125 126 PrivateMembersClass deserializedPrivateMembersClass = JsonConvert.DeserializeObject<PrivateMembersClass>(@"{ 127 ""_privateString"": ""Private!"", 128 ""i"": -2, 129 ""_internalString"": ""Internal!"" 130 }", new JsonSerializerSettings 131 { 132 ContractResolver = new CamelCasePropertyNamesContractResolver { DefaultMembersSearchFlags = BindingFlags.NonPublic | BindingFlags.Instance } 133 }); 134 135 Assert.AreEqual("Private!", ReflectionUtils.GetMemberValue(typeof(PrivateMembersClass).GetField("_privateString", BindingFlags.Instance | BindingFlags.NonPublic), deserializedPrivateMembersClass)); 136 Assert.AreEqual("Internal!", ReflectionUtils.GetMemberValue(typeof(PrivateMembersClass).GetField("_internalString", BindingFlags.Instance | BindingFlags.NonPublic), deserializedPrivateMembersClass)); 137 138 // readonly 139 Assert.AreEqual(0, ReflectionUtils.GetMemberValue(typeof(PrivateMembersClass).GetField("i", BindingFlags.Instance | BindingFlags.NonPublic), deserializedPrivateMembersClass)); 140 } 141 #pragma warning restore 618 142 #endif 143 144 [Test] BlogPostExample()145 public void BlogPostExample() 146 { 147 Product product = new Product 148 { 149 ExpiryDate = new DateTime(2010, 12, 20, 18, 1, 0, DateTimeKind.Utc), 150 Name = "Widget", 151 Price = 9.99m, 152 Sizes = new[] { "Small", "Medium", "Large" } 153 }; 154 155 string json = 156 JsonConvert.SerializeObject( 157 product, 158 Formatting.Indented, 159 new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() } 160 ); 161 162 //{ 163 // "name": "Widget", 164 // "expiryDate": "\/Date(1292868060000)\/", 165 // "price": 9.99, 166 // "sizes": [ 167 // "Small", 168 // "Medium", 169 // "Large" 170 // ] 171 //} 172 173 StringAssert.AreEqual(@"{ 174 ""name"": ""Widget"", 175 ""expiryDate"": ""2010-12-20T18:01:00Z"", 176 ""price"": 9.99, 177 ""sizes"": [ 178 ""Small"", 179 ""Medium"", 180 ""Large"" 181 ] 182 }", json); 183 } 184 185 #if !(NET35 || NET20 || PORTABLE40) 186 [Test] DynamicCamelCasePropertyNames()187 public void DynamicCamelCasePropertyNames() 188 { 189 dynamic o = new TestDynamicObject(); 190 o.Text = "Text!"; 191 o.Integer = int.MaxValue; 192 193 string json = JsonConvert.SerializeObject(o, Formatting.Indented, 194 new JsonSerializerSettings 195 { 196 ContractResolver = new CamelCasePropertyNamesContractResolver() 197 }); 198 199 StringAssert.AreEqual(@"{ 200 ""explicit"": false, 201 ""text"": ""Text!"", 202 ""integer"": 2147483647, 203 ""int"": 0, 204 ""childObject"": null 205 }", json); 206 } 207 #endif 208 209 [Test] DictionaryCamelCasePropertyNames()210 public void DictionaryCamelCasePropertyNames() 211 { 212 Dictionary<string, string> values = new Dictionary<string, string> 213 { 214 { "First", "Value1!" }, 215 { "Second", "Value2!" } 216 }; 217 218 string json = JsonConvert.SerializeObject(values, Formatting.Indented, 219 new JsonSerializerSettings 220 { 221 ContractResolver = new CamelCasePropertyNamesContractResolver() 222 }); 223 224 StringAssert.AreEqual(@"{ 225 ""first"": ""Value1!"", 226 ""second"": ""Value2!"" 227 }", json); 228 } 229 } 230 }