diff --git a/Build/build.ps1 b/Build/build.ps1
index 9437abcd..a384b71e 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.
+
+
+
+
\ 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.
+
+
+
+
\ 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.
+
+
+
+
\ 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.
+
+
+
+
\ 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.
+
+
+
+
\ 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 @@
+