diff --git a/Build/build.ps1 b/Build/build.ps1 index 80b6a21e..265c121f 100644 --- a/Build/build.ps1 +++ b/Build/build.ps1 @@ -7,7 +7,7 @@ $packageId = "Newtonsoft.Json" $signAssemblies = $false $signKeyPath = "C:\Development\Releases\newtonsoft.snk" - $buildDocumentation = $false + $buildDocumentation = $true $buildNuGet = $true $treatWarningsAsErrors = $false $workingName = if ($workingName) {$workingName} else {"Working"} diff --git a/Doc/Samples/Serializer/NamingStrategyAttributes.aml b/Doc/Samples/Serializer/NamingStrategyAttributes.aml new file mode 100644 index 00000000..4701cf9f --- /dev/null +++ b/Doc/Samples/Serializer/NamingStrategyAttributes.aml @@ -0,0 +1,16 @@ + + + + + This sample uses T:Newtonsoft.Json.Serialization.NamingStrategy + types specified on attributes to control serialized property names. + +
+ Sample + + + + +
+
+
\ No newline at end of file diff --git a/Doc/Samples/Serializer/NamingStrategyCamelCase.aml b/Doc/Samples/Serializer/NamingStrategyCamelCase.aml new file mode 100644 index 00000000..b40e00a9 --- /dev/null +++ b/Doc/Samples/Serializer/NamingStrategyCamelCase.aml @@ -0,0 +1,16 @@ + + + + + This sample uses a T:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy + specified using a contract resolver to camel case serialized property names. + +
+ Sample + + + + +
+
+
\ No newline at end of file diff --git a/Doc/Samples/Serializer/NamingStrategySkipDictionaryKeys.aml b/Doc/Samples/Serializer/NamingStrategySkipDictionaryKeys.aml new file mode 100644 index 00000000..4aae69e5 --- /dev/null +++ b/Doc/Samples/Serializer/NamingStrategySkipDictionaryKeys.aml @@ -0,0 +1,16 @@ + + + + + This sample configures a T:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy + to not camel case dictionary keys. + +
+ Sample + + + + +
+
+
\ No newline at end of file diff --git a/Doc/Samples/Serializer/NamingStrategySkipSpecifiedNames.aml b/Doc/Samples/Serializer/NamingStrategySkipSpecifiedNames.aml new file mode 100644 index 00000000..7f7eebc1 --- /dev/null +++ b/Doc/Samples/Serializer/NamingStrategySkipSpecifiedNames.aml @@ -0,0 +1,16 @@ + + + + + This sample configures a T:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy + to not camel case properties that already have a name specified with an attribute. + +
+ Sample + + + + +
+
+
\ No newline at end of file diff --git a/Doc/Samples/Serializer/NamingStrategySnakeCase.aml b/Doc/Samples/Serializer/NamingStrategySnakeCase.aml new file mode 100644 index 00000000..39a5dcbf --- /dev/null +++ b/Doc/Samples/Serializer/NamingStrategySnakeCase.aml @@ -0,0 +1,16 @@ + + + + + This sample uses a T:Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy + specified using a contract resolver to snake case serialized property names. + +
+ Sample + + + + +
+
+
\ No newline at end of file diff --git a/Doc/SerializationAttributes.aml b/Doc/SerializationAttributes.aml index 3fe7ed53..8b313f91 100644 --- a/Doc/SerializationAttributes.aml +++ b/Doc/SerializationAttributes.aml @@ -48,6 +48,8 @@ (a member must have the JsonProperty or DataMember attribute to be serialized), opt-out (everything is serialized by default but can be ignored with the JsonIgnoreAttribute, Json.NET's default behavior) or fields (all public and private fields are serialized and properties are ignored). + The NamingStrategy setting on this attributes can be set to a T:Newtonsoft.Json.Serialization.NamingStrategy + type that specifies how property names are serialized. Json.NET serializes .NET classes that implement IEnumerable as a JSON array populated with the IEnumerable values. Placing the T:Newtonsoft.Json.JsonObjectAttribute overrides this behavior and forces the serializer to serialize the class's fields and properties. @@ -77,6 +79,7 @@ JsonPropertyAttribute indicates that a property should be serialized when member serialization is set to opt-in. It includes non-public properties in serialization and deserialization. It can be used to customize type name, reference, null, and default value handling for the property value. + It can be used to customize the T:Newtonsoft.Json.Serialization.NamingStrategy of the serialized property name. It can be used to customize the property's collection items JsonConverter, type name handling, and reference handling. diff --git a/Doc/doc.content b/Doc/doc.content index 7524c2c7..10cc9241 100644 --- a/Doc/doc.content +++ b/Doc/doc.content @@ -30,7 +30,7 @@ - + @@ -72,6 +72,7 @@ + @@ -90,8 +91,12 @@ + + + + - + @@ -110,7 +115,7 @@ - + @@ -152,7 +157,7 @@ - + diff --git a/Doc/doc.shfbproj b/Doc/doc.shfbproj index 8263bced..e6dc4eea 100644 --- a/Doc/doc.shfbproj +++ b/Doc/doc.shfbproj @@ -8,7 +8,7 @@ AnyCPU 2.0 {fd19f68e-72c8-4576-9775-b4480b0db686} - 1.9.9.0 + 2015.6.5.0 Documentation @@ -100,6 +100,11 @@ + + + + + diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyAttributes.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyAttributes.cs new file mode 100644 index 00000000..32beb5f6 --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyAttributes.cs @@ -0,0 +1,83 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +#if DNXCORE50 +using Xunit; +using Test = Xunit.FactAttribute; +using Assert = Newtonsoft.Json.Tests.XUnitAssert; +#else +using NUnit.Framework; +#endif + +namespace Newtonsoft.Json.Tests.Documentation.Samples.Serializer +{ + [TestFixture] + public class NamingStrategyAttributes : TestFixtureBase + { + #region Types + [JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] + public class User + { + public string FirstName { get; set; } + public string LastName { get; set; } + [JsonProperty(NamingStrategyType = typeof(SnakeCaseNamingStrategy))] + public int SnakeRating { get; set; } + } + #endregion + + [Test] + public void Example() + { + #region Usage + User user = new User + { + FirstName = "Tom", + LastName = "Riddle", + SnakeRating = 10 + }; + + string json = JsonConvert.SerializeObject(user, Formatting.Indented); + + Console.WriteLine(json); + // { + // "firstName": "Tom", + // "lastName": "Riddle", + // "snake_rating": 10 + // } + #endregion + + StringAssert.AreEqual(@"{ + ""firstName"": ""Tom"", + ""lastName"": ""Riddle"", + ""snake_rating"": 10 +}", json); + } + } +} \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyCamelCase.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyCamelCase.cs new file mode 100644 index 00000000..9a6b000d --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyCamelCase.cs @@ -0,0 +1,86 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +#if DNXCORE50 +using Xunit; +using Test = Xunit.FactAttribute; +using Assert = Newtonsoft.Json.Tests.XUnitAssert; +#else +using NUnit.Framework; +#endif + +namespace Newtonsoft.Json.Tests.Documentation.Samples.Serializer +{ + [TestFixture] + public class NamingStrategyCamelCase : TestFixtureBase + { + #region Types + public class User + { + public string UserName { get; set; } + public bool Enabled { get; set; } + } + #endregion + + [Test] + public void Example() + { + #region Usage + User user1 = new User + { + UserName = "jamesn", + Enabled = true + }; + + DefaultContractResolver contractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy() + }; + + string json = JsonConvert.SerializeObject(user1, new JsonSerializerSettings + { + ContractResolver = contractResolver, + Formatting = Formatting.Indented + }); + + Console.WriteLine(json); + // { + // "userName": "jamesn", + // "enabled": true + // } + #endregion + + StringAssert.AreEqual(@"{ + ""userName"": ""jamesn"", + ""enabled"": true +}", json); + } + } +} \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySkipDictionaryKeys.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySkipDictionaryKeys.cs new file mode 100644 index 00000000..48e9a1c8 --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySkipDictionaryKeys.cs @@ -0,0 +1,106 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +#if DNXCORE50 +using Xunit; +using Test = Xunit.FactAttribute; +using Assert = Newtonsoft.Json.Tests.XUnitAssert; +#else +using NUnit.Framework; +#endif + +namespace Newtonsoft.Json.Tests.Documentation.Samples.Serializer +{ + [TestFixture] + public class NamingStrategySkipDictionaryKeys : TestFixtureBase + { + #region Types + public class DailyHighScores + { + public DateTime Date { get; set; } + public string Game { get; set; } + public Dictionary UserPoints { get; set; } + } + #endregion + + [Test] + public void Example() + { + #region Usage + DailyHighScores dailyHighScores = new DailyHighScores + { + Date = new DateTime(2016, 6, 27, 0, 0, 0, DateTimeKind.Utc), + Game = "Donkey Kong", + UserPoints = new Dictionary + { + ["JamesNK"] = 9001, + ["JoC"] = 1337, + ["JessicN"] = 1000 + } + }; + + DefaultContractResolver contractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + ProcessDictionaryKeys = false + } + }; + + string json = JsonConvert.SerializeObject(dailyHighScores, new JsonSerializerSettings + { + ContractResolver = contractResolver, + Formatting = Formatting.Indented + }); + + Console.WriteLine(json); + // { + // "date": "2016-06-27T00:00:00Z", + // "game": "Donkey Kong", + // "userPoints": { + // "JamesNK": 9001, + // "JoC": 1337, + // "JessicN": 1000 + // } + // } + #endregion + + StringAssert.AreEqual(@"{ + ""date"": ""2016-06-27T00:00:00Z"", + ""game"": ""Donkey Kong"", + ""userPoints"": { + ""JamesNK"": 9001, + ""JoC"": 1337, + ""JessicN"": 1000 + } +}", json); + } + } +} \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySkipSpecifiedNames.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySkipSpecifiedNames.cs new file mode 100644 index 00000000..72edcaff --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySkipSpecifiedNames.cs @@ -0,0 +1,94 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +#if DNXCORE50 +using Xunit; +using Test = Xunit.FactAttribute; +using Assert = Newtonsoft.Json.Tests.XUnitAssert; +#else +using NUnit.Framework; +#endif + +namespace Newtonsoft.Json.Tests.Documentation.Samples.Serializer +{ + [TestFixture] + public class NamingStrategySkipSpecifiedNames : TestFixtureBase + { + #region Types + public class User + { + public string FirstName { get; set; } + public string LastName { get; set; } + [JsonProperty(PropertyName = "UPN")] + public string Upn { get; set; } + } + #endregion + + [Test] + public void Example() + { + #region Usage + User user = new User + { + FirstName = "John", + LastName = "Smith", + Upn = "john.smith@acme.com" + }; + + DefaultContractResolver contractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + }; + + string json = JsonConvert.SerializeObject(user, new JsonSerializerSettings + { + ContractResolver = contractResolver, + Formatting = Formatting.Indented + }); + + Console.WriteLine(json); + // { + // "firstName": "John", + // "lastName": "Smith", + // "UPN": "john.smith@acme.com" + // } + #endregion + + StringAssert.AreEqual(@"{ + ""firstName"": ""John"", + ""lastName"": ""Smith"", + ""UPN"": ""john.smith@acme.com"" +}", json); + } + } +} \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySnakeCase.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySnakeCase.cs new file mode 100644 index 00000000..b16caf7b --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategySnakeCase.cs @@ -0,0 +1,86 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +#if DNXCORE50 +using Xunit; +using Test = Xunit.FactAttribute; +using Assert = Newtonsoft.Json.Tests.XUnitAssert; +#else +using NUnit.Framework; +#endif + +namespace Newtonsoft.Json.Tests.Documentation.Samples.Serializer +{ + [TestFixture] + public class NamingStrategySnakeCase : TestFixtureBase + { + #region Types + public class User + { + public string UserName { get; set; } + public bool Enabled { get; set; } + } + #endregion + + [Test] + public void Example() + { + #region Usage + User user1 = new User + { + UserName = "jamesn", + Enabled = true + }; + + DefaultContractResolver contractResolver = new DefaultContractResolver + { + NamingStrategy = new SnakeCaseNamingStrategy() + }; + + string json = JsonConvert.SerializeObject(user1, new JsonSerializerSettings + { + ContractResolver = contractResolver, + Formatting = Formatting.Indented + }); + + Console.WriteLine(json); + // { + // "user_name": "jamesn", + // "enabled": true + // } + #endregion + + StringAssert.AreEqual(@"{ + ""user_name"": ""jamesn"", + ""enabled"": true +}", json); + } + } +} \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj index 5eb93ab5..1ae55cff 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj @@ -157,6 +157,10 @@ + + + + @@ -205,6 +209,7 @@ + diff --git a/Tools/NuGet/NuGet.exe b/Tools/NuGet/NuGet.exe index 31fc9885..6bb79fe5 100644 Binary files a/Tools/NuGet/NuGet.exe and b/Tools/NuGet/NuGet.exe differ