diff --git a/Build/build.ps1 b/Build/build.ps1
index 37746543f..da53db98b 100644
--- a/Build/build.ps1
+++ b/Build/build.ps1
@@ -1,7 +1,7 @@
properties {
- $zipFileName = "Json120r2.zip"
- $majorVersion = "12.0"
- $majorWithReleaseVersion = "12.0.2"
+ $zipFileName = "Json130r3.zip"
+ $majorVersion = "13.0"
+ $majorWithReleaseVersion = "13.0.2"
$nugetPrerelease = $null
$version = GetVersion $majorWithReleaseVersion
$packageId = "Newtonsoft.Json"
@@ -12,9 +12,11 @@
$msbuildVerbosity = 'minimal'
$treatWarningsAsErrors = $false
$workingName = if ($workingName) {$workingName} else {"Working"}
- $netCliChannel = "2.0"
- $netCliVersion = "2.2.105"
+ $assemblyVersion = if ($assemblyVersion) {$assemblyVersion} else {$majorVersion + '.0.0'}
+ $netCliChannel = "Current"
+ $netCliVersion = "6.0.400"
$nugetUrl = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
+ $ensureNetCliSdk = $true
$baseDir = resolve-path ..
$buildDir = "$baseDir\Build"
@@ -30,15 +32,14 @@
$nunitConsolePath = "$buildDir\Temp\NUnit.ConsoleRunner.$nunitConsoleVersion"
$builds = @(
- @{Framework = "netstandard2.0"; TestsFunction = "NetCliTests"; TestFramework = "netcoreapp2.2"; Enabled=$true},
- @{Framework = "netstandard1.3"; TestsFunction = "NetCliTests"; TestFramework = "netcoreapp1.1"; Enabled=$true},
- @{Framework = "netstandard1.0"; TestsFunction = "NetCliTests"; TestFramework = "netcoreapp1.0"; Enabled=$true},
+ @{Framework = "net6.0"; TestsFunction = "NetCliTests"; TestFramework = "net6.0"; Enabled=$true},
+ @{Framework = "netstandard2.0"; TestsFunction = "NetCliTests"; TestFramework = "net5.0"; Enabled=$true},
+ @{Framework = "netstandard1.3"; TestsFunction = "NetCliTests"; TestFramework = "netcoreapp3.1"; Enabled=$true},
+ @{Framework = "netstandard1.0"; TestsFunction = "NetCliTests"; TestFramework = "netcoreapp2.1"; Enabled=$true},
@{Framework = "net45"; TestsFunction = "NUnitTests"; TestFramework = "net46"; NUnitFramework="net-4.0"; Enabled=$true},
@{Framework = "net40"; TestsFunction = "NUnitTests"; NUnitFramework="net-4.0"; Enabled=$true},
@{Framework = "net35"; TestsFunction = "NUnitTests"; NUnitFramework="net-2.0"; Enabled=$true},
- @{Framework = "net20"; TestsFunction = "NUnitTests"; NUnitFramework="net-2.0"; Enabled=$true},
- @{Framework = "portable-net45+win8+wpa81+wp8"; TestsFunction = "NUnitTests"; TestFramework = "net452"; NUnitFramework="net-4.0"; Enabled=$true},
- @{Framework = "portable-net40+win8+wpa81+wp8+sl5"; TestsFunction = "NUnitTests"; TestFramework = "net451"; NUnitFramework="net-4.0"; Enabled=$true}
+ @{Framework = "net20"; TestsFunction = "NUnitTests"; NUnitFramework="net-2.0"; Enabled=$true}
)
}
@@ -70,7 +71,10 @@ task Build -depends Clean {
mkdir "$buildDir\Temp" -Force
- EnsureDotNetCli
+ if ($ensureNetCliSdk)
+ {
+ EnsureDotNetCli
+ }
EnsureNuGetExists
EnsureNuGetPackage "vswhere" $vswherePath $vswhereVersion
EnsureNuGetPackage "NUnit.ConsoleRunner" $nunitConsolePath $nunitConsoleVersion
@@ -154,11 +158,9 @@ function NetCliBuild()
exec { & $script:msBuildPath "/t:restore" "/v:$msbuildVerbosity" "/p:Configuration=Release" "/p:LibraryFrameworks=`"$libraryFrameworks`"" "/p:TestFrameworks=`"$testFrameworks`"" "/m" $projectPath | Out-Default } "Error restoring $projectPath"
- Write-Host -ForegroundColor Green "Building $libraryFrameworks in $projectPath"
+ Write-Host -ForegroundColor Green "Building $libraryFrameworks $assemblyVersion in $projectPath"
Write-Host
- $assemblyVersion = $majorVersion + '.0.0'
-
exec { & $script:msBuildPath "/t:build" "/v:$msbuildVerbosity" $projectPath "/p:Configuration=Release" "/p:LibraryFrameworks=`"$libraryFrameworks`"" "/p:TestFrameworks=`"$testFrameworks`"" "/p:AssemblyOriginatorKeyFile=$signKeyPath" "/p:SignAssembly=$signAssemblies" "/p:TreatWarningsAsErrors=$treatWarningsAsErrors" "/p:AdditionalConstants=$additionalConstants" "/p:GeneratePackageOnBuild=$buildNuGet" "/p:ContinuousIntegrationBuild=true" "/p:PackageId=$packageId" "/p:VersionPrefix=$majorWithReleaseVersion" "/p:VersionSuffix=$nugetPrerelease" "/p:AssemblyVersion=$assemblyVersion" "/p:FileVersion=$version" "/m" }
}
@@ -173,6 +175,8 @@ function EnsureDotnetCli()
-OutFile "$buildDir\Temp\dotnet-install.ps1"
exec { & $buildDir\Temp\dotnet-install.ps1 -Channel $netCliChannel -Version $netCliVersion | Out-Default }
+ exec { & $buildDir\Temp\dotnet-install.ps1 -Channel $netCliChannel -Version '3.1.402' | Out-Default }
+ exec { & $buildDir\Temp\dotnet-install.ps1 -Channel $netCliChannel -Version '2.1.811' | Out-Default }
}
function EnsureNuGetExists()
@@ -323,4 +327,4 @@ function Execute-Command($command) {
$currentRetry = $currentRetry + 1
}
} while (!$success)
-}
\ No newline at end of file
+}
diff --git a/Build/version.json b/Build/version.json
index b92f445b7..7e0f6ad33 100644
--- a/Build/version.json
+++ b/Build/version.json
@@ -1,5 +1,6 @@
{
- "Major": 12,
+ "Major": 13,
"Release": 2,
- "Prerelease": null
+ "Prerelease": null,
+ "Assembly": null
}
\ No newline at end of file
diff --git a/Doc/Samples/Serializer/NullValueHandlingIgnore.aml b/Doc/Samples/Serializer/NullValueHandlingIgnore.aml
index afec219a3..b502d90dd 100644
--- a/Doc/Samples/Serializer/NullValueHandlingIgnore.aml
+++ b/Doc/Samples/Serializer/NullValueHandlingIgnore.aml
@@ -3,7 +3,7 @@
This sample serializes an object to JSON with T:Newtonsoft.Json.NullValueHandling
- set to Ignore so that properties with a default value aren't included in the JSON result.
+ set to Ignore so that properties with a default value of null aren't included in the JSON result.
-
\ No newline at end of file
+
diff --git a/Doc/Samples/Serializer/SerializeTypeNameHandling.aml b/Doc/Samples/Serializer/SerializeTypeNameHandling.aml
index 79eda1e9f..f34241659 100644
--- a/Doc/Samples/Serializer/SerializeTypeNameHandling.aml
+++ b/Doc/Samples/Serializer/SerializeTypeNameHandling.aml
@@ -3,7 +3,7 @@
This sample uses the T:Newtonsoft.Json.TypeNameHandling
- setting to include type information when serializing JSON and read type information so that the create types are created when deserializing JSON.
+ setting to include type information when serializing JSON and read type information so that the correct types are created when deserializing JSON.
-
\ No newline at end of file
+
diff --git a/Doc/SelectToken.aml b/Doc/SelectToken.aml
index 9b8ce1672..03299183c 100644
--- a/Doc/SelectToken.aml
+++ b/Doc/SelectToken.aml
@@ -28,7 +28,7 @@
SelectToken supports JSONPath queries. Find out more about JSONPath
here
-http://goessner.net/articles/JsonPath/
+https://goessner.net/articles/JsonPath/
_blank
.
@@ -50,4 +50,4 @@
Overload:Newtonsoft.Json.Linq.JToken.SelectToken
-
\ No newline at end of file
+
diff --git a/Src/Directory.Build.props b/Src/Directory.Build.props
new file mode 100644
index 000000000..bafd1cd9e
--- /dev/null
+++ b/Src/Directory.Build.props
@@ -0,0 +1,25 @@
+
+
+ 4.6.2
+ 0.10.10
+ 4.2.3
+ 6.0.0
+ 4.3.0
+ 1.0.0
+ 16.3.0
+ 4.8.1
+ 3.11.0
+ 3.13.0
+ 4.4.0
+ 1.4.0
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.4.0
+ 2.3.1
+ 2.3.1
+
+
diff --git a/Src/Newtonsoft.Json.TestConsole/Newtonsoft.Json.TestConsole.csproj b/Src/Newtonsoft.Json.TestConsole/Newtonsoft.Json.TestConsole.csproj
index 97a67d43e..b8a43257f 100644
--- a/Src/Newtonsoft.Json.TestConsole/Newtonsoft.Json.TestConsole.csproj
+++ b/Src/Newtonsoft.Json.TestConsole/Newtonsoft.Json.TestConsole.csproj
@@ -1,7 +1,7 @@
Exe
- net46;netcoreapp2.2
+ net46;net6.0
latest
Newtonsoft.Json.TestConsole
Newtonsoft.Json.TestConsole
diff --git a/Src/Newtonsoft.Json.Tests/Benchmarks/LowLevelBenchmarks.cs b/Src/Newtonsoft.Json.Tests/Benchmarks/LowLevelBenchmarks.cs
index 3aae21b04..9c5487456 100644
--- a/Src/Newtonsoft.Json.Tests/Benchmarks/LowLevelBenchmarks.cs
+++ b/Src/Newtonsoft.Json.Tests/Benchmarks/LowLevelBenchmarks.cs
@@ -35,7 +35,7 @@
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using Newtonsoft.Json.Utilities;
-#if !PORTABLE || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD2_0 || NET6_0_OR_GREATER
using MemberTypes = System.Reflection.MemberTypes;
using BindingFlags = System.Reflection.BindingFlags;
#else
diff --git a/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs b/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs
index 9c8c7f955..1998ff982 100644
--- a/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs
@@ -31,7 +31,7 @@
using System.Runtime.Serialization;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Tests.TestObjects;
-#if !(NET20 || NET35 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Numerics;
#endif
using System.Text;
@@ -1495,7 +1495,7 @@ public void Utf8Text()
Assert.AreEqual(badText, (string)o["test"]);
}
-#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class BigIntegerTestClass
{
public BigInteger Blah { get; set; }
diff --git a/Src/Newtonsoft.Json.Tests/Bson/BsonWriterAsyncTests.cs b/Src/Newtonsoft.Json.Tests/Bson/BsonWriterAsyncTests.cs
index ff465efd6..e86bc6f46 100644
--- a/Src/Newtonsoft.Json.Tests/Bson/BsonWriterAsyncTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Bson/BsonWriterAsyncTests.cs
@@ -26,7 +26,7 @@
#pragma warning disable 618
#if !(NET20 || NET35 || NET40 || PORTABLE40)
using System;
-#if !(NET20 || NET35 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Numerics;
#endif
using System.Text;
@@ -499,7 +499,7 @@ public async Task DateTimeZoneHandlingAsync()
Assert.AreEqual("10-00-00-00-09-30-00-C8-88-07-6B-DC-00-00-00-00", (BitConverter.ToString(ms.ToArray())));
}
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public async Task WriteBigIntegerAsync()
{
diff --git a/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs b/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs
index ae8b61692..850c60a5f 100644
--- a/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs
@@ -26,7 +26,7 @@
#pragma warning disable 618
using System;
using System.Collections.Generic;
-#if !(NET20 || NET35 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Numerics;
#endif
using System.Text;
@@ -798,7 +798,7 @@ public void WriteStringReadGuid()
Assert.AreEqual(c.AGuid, c2.AGuid.ToString());
}
-#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void WriteBigInteger()
{
diff --git a/Src/Newtonsoft.Json.Tests/Converters/BinaryConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/BinaryConverterTests.cs
index 80f96d6fe..fa420c823 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/BinaryConverterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/BinaryConverterTests.cs
@@ -28,7 +28,7 @@
#if !(NET20 || DNXCORE50)
using System.Data.Linq;
#endif
-#if !DNXCORE50 || NETSTANDARD2_0
+#if !DNXCORE50 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Data.SqlTypes;
#endif
using System.Text;
@@ -121,7 +121,7 @@ public void SerializeByteArrayClass()
}", json);
}
-#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class SqlBinaryClass
{
public SqlBinary SqlBinary { get; set; }
diff --git a/Src/Newtonsoft.Json.Tests/Converters/DataSetConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/DataSetConverterTests.cs
index 3c1274228..ff3534b16 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/DataSetConverterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/DataSetConverterTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using Newtonsoft.Json.Converters;
#if DNXCORE50
diff --git a/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs
index 610760768..77977febf 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.IO;
using System.Text;
using Newtonsoft.Json.Bson;
diff --git a/Src/Newtonsoft.Json.Tests/Converters/DiscriminatedUnionConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/DiscriminatedUnionConverterTests.cs
index 7cac6eba2..3431bb53a 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/DiscriminatedUnionConverterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/DiscriminatedUnionConverterTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET40 || NET35 || NET20 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET40 || NET35 || NET20 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Diagnostics;
using System.Reflection;
using Microsoft.FSharp.Core;
diff --git a/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs
index 5f0052302..0ee769cf1 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs
@@ -123,7 +123,7 @@ public void SerializeCustomFormattedDateTime()
Assert.AreEqual(2006, d.Year);
}
-#if !(DNXCORE50) || NETSTANDARD2_0
+#if !(DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeFormattedDateTimeNewZealandCulture()
{
diff --git a/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs
index 2a6e1dc84..2e1b0af0c 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs
@@ -255,7 +255,7 @@ public void StringEnumConverter_NamingStrategyTypeCtor_Null()
ExceptionAssert.Throws(
() => new StringEnumConverter(null),
@"Value cannot be null.
-Parameter name: namingStrategyType");
+Parameter name: namingStrategyType", "Value cannot be null. (Parameter 'namingStrategyType')");
}
[Test]
@@ -264,7 +264,7 @@ public void StringEnumConverter_NamingStrategyTypeWithArgsCtor_Null()
ExceptionAssert.Throws(
() => new StringEnumConverter(null, new object[] { true, true, true }, false),
@"Value cannot be null.
-Parameter name: namingStrategyType");
+Parameter name: namingStrategyType", "Value cannot be null. (Parameter 'namingStrategyType')");
}
[Test]
diff --git a/Src/Newtonsoft.Json.Tests/Converters/UnixDateTimeConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/UnixDateTimeConverterTests.cs
index 638c74844..ed8ee1f9b 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/UnixDateTimeConverterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/UnixDateTimeConverterTests.cs
@@ -25,6 +25,7 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
#if DNXCORE50
using Xunit;
using Test = Xunit.FactAttribute;
@@ -71,6 +72,17 @@ public void SerializeInvalidDate()
);
}
+ [Test]
+ public void SerializeDateBeforeEpoch()
+ {
+ DateTime date = new DateTime(1964, 2, 7);
+ long dateSeconds = (long)(date.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;
+
+ string result = JsonConvert.SerializeObject(date, new UnixDateTimeConverter { AllowPreEpoch = true });
+
+ Assert.AreEqual(dateSeconds.ToString(CultureInfo.InvariantCulture), result);
+ }
+
[Test]
public void WriteJsonInvalidType()
{
@@ -159,6 +171,19 @@ public void DeserializeInvalidStringToDateTimeOffset()
"Cannot convert invalid value to System.DateTimeOffset. Path '', line 1, position 5."
);
}
+
+ [Test]
+ public void DeserializeDateTimeOffsetBeforeEpoch()
+ {
+ UnixDateTimeConverter converter = new UnixDateTimeConverter(true);
+ DateTimeOffset d = new DateTimeOffset(1969, 2, 1, 20, 6, 18, TimeSpan.Zero);
+
+ string json = JsonConvert.SerializeObject(d, converter);
+
+ DateTimeOffset result = JsonConvert.DeserializeObject(json, converter);
+
+ Assert.AreEqual(new DateTimeOffset(1969, 2, 1, 20, 6, 18, TimeSpan.Zero), result);
+ }
#endif
[Test]
@@ -186,6 +211,14 @@ public void DeserializeInvalidValue()
);
}
+ [Test]
+ public void DeserializeNegativeIntegerToDateTimeBeforeEpoch()
+ {
+ DateTime result = JsonConvert.DeserializeObject("-1514840476", new UnixDateTimeConverter(true));
+
+ Assert.AreEqual(new DateTime(1921, 12, 31, 02, 58, 44, DateTimeKind.Utc), result);
+ }
+
[Test]
public void DeserializeInvalidValueType()
{
@@ -263,6 +296,49 @@ public void ConverterObject()
Assert.IsNull(obj2.Object2);
Assert.AreEqual(new DateTime(2018, 1, 1, 21, 1, 16, DateTimeKind.Utc), obj2.ObjectNotHandled);
}
+
+#if !NET20
+ [Test]
+ public void ConverterObjectWithDatesBeforeEpoch()
+ {
+ PreEpochUnixConverterObject obj1 = new PreEpochUnixConverterObject
+ {
+ Date1 = new DateTime(1969, 1, 1, 0, 0, 3, DateTimeKind.Utc),
+ Date2 = new DateTimeOffset(1969, 1, 1, 0, 0, 3, TimeSpan.Zero)
+ };
+
+ string json = JsonConvert.SerializeObject(obj1, Formatting.Indented);
+ StringAssert.AreEqual(@"{
+ ""Date1"": -31535997,
+ ""Date2"": -31535997
+}", json);
+
+ PreEpochUnixConverterObject obj2 = JsonConvert.DeserializeObject(json);
+ Assert.IsNotNull(obj2);
+
+ Assert.AreEqual(new DateTime(1969, 1, 1, 0, 0, 3, DateTimeKind.Utc), obj2.Date1);
+ Assert.AreEqual(new DateTimeOffset(1969, 1, 1, 0, 0, 3, TimeSpan.Zero), obj2.Date2);
+ }
+#else
+ [Test]
+ public void ConverterObjectWithDatesBeforeEpoch()
+ {
+ PreEpochUnixConverterObject obj1 = new PreEpochUnixConverterObject
+ {
+ Date1 = new DateTime(1969, 1, 1, 0, 0, 3, DateTimeKind.Utc)
+ };
+
+ string json = JsonConvert.SerializeObject(obj1, Formatting.Indented);
+ StringAssert.AreEqual(@"{
+ ""Date1"": -31535997
+}", json);
+
+ PreEpochUnixConverterObject obj2 = JsonConvert.DeserializeObject(json);
+ Assert.IsNotNull(obj2);
+
+ Assert.AreEqual(new DateTime(1969, 1, 1, 0, 0, 3, DateTimeKind.Utc), obj2.Date1);
+ }
+#endif
}
[JsonArray(ItemConverterType = typeof(UnixDateTimeConverter))]
@@ -281,4 +357,15 @@ public class UnixConverterObject
[JsonConverter(typeof(UnixDateTimeConverter))]
public object ObjectNotHandled { get; set; }
}
+
+ public class PreEpochUnixConverterObject
+ {
+ [JsonConverter(typeof(UnixDateTimeConverter), true)]
+ public DateTime Date1 { get; set; }
+
+#if !NET20
+ [JsonConverter (typeof(UnixDateTimeConverter), true)]
+ public DateTimeOffset Date2 { get; set; }
+#endif
+ }
}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs
index f420ef6b4..e621feb37 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Globalization;
#if NET20
using Newtonsoft.Json.Utilities.LinqBridge;
@@ -58,7 +58,7 @@ namespace Newtonsoft.Json.Tests.Converters
[TestFixture]
public class XmlNodeConverterTest : TestFixtureBase
{
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
private string SerializeXmlNode(XmlNode node)
{
string json = JsonConvert.SerializeXmlNode(node, Formatting.Indented);
@@ -151,7 +151,7 @@ private string IndentXml(string xml)
return sw.ToString();
}
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeXmlNode_DefaultDate()
{
@@ -160,6 +160,14 @@ public void DeserializeXmlNode_DefaultDate()
Assert.AreEqual("", xmlNode.OuterXml);
}
+ [Test]
+ public void XmlNode_Null()
+ {
+ string json = JsonConvert.SerializeXmlNode(null);
+
+ Assert.AreEqual("null", json);
+ }
+
[Test]
public void XmlNode_Roundtrip_PropertyNameWithColon()
{
@@ -305,6 +313,14 @@ public void WriteJsonNull()
}
#if !NET20
+ [Test]
+ public void XNode_Null()
+ {
+ string json = JsonConvert.SerializeXNode(null);
+
+ Assert.AreEqual("null", json);
+ }
+
[Test]
public void XNode_UnescapeTextContent()
{
@@ -553,7 +569,7 @@ public void MultipleNamespacesXDocument()
}
#endif
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void MultipleNamespacesXmlDocument()
{
@@ -732,7 +748,7 @@ public void GroupElementsOfTheSameName()
", doc.ToString());
}
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeEmptyDocument()
{
@@ -778,7 +794,7 @@ public void SerializeAndDeserializeXmlWithNamespaceInChildrenAndNoValueInChildre
Assert.IsTrue(equals);
}
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeUndeclaredNamespacePrefix()
{
@@ -793,7 +809,7 @@ public void DeserializeUndeclaredNamespacePrefix()
#endif
#endif
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeMultipleRootElements()
{
@@ -1588,7 +1604,7 @@ public void NestedArrays()
]
}";
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
XmlDocument newDoc = JsonConvert.DeserializeXmlNode(json, "myRoot");
string xml = IndentXml(newDoc.InnerXml);
@@ -1626,7 +1642,7 @@ public void NestedArrays()
", IndentXml(newXDoc.ToString(SaveOptions.DisableFormatting)));
#endif
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
string newJson = JsonConvert.SerializeXmlNode(newDoc, Formatting.Indented);
Console.WriteLine(newJson);
#endif
@@ -1651,7 +1667,7 @@ public void RoundTripNestedArrays()
]
}";
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
XmlDocument newDoc = JsonConvert.DeserializeXmlNode(json, "myRoot", true);
StringAssert.AreEqual(@"
@@ -1687,7 +1703,7 @@ public void RoundTripNestedArrays()
", IndentXml(newXDoc.ToString(SaveOptions.DisableFormatting)));
#endif
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
string newJson = JsonConvert.SerializeXmlNode(newDoc, Formatting.Indented, true);
StringAssert.AreEqual(json, newJson);
#endif
@@ -1713,7 +1729,7 @@ public void MultipleNestedArraysToXml()
]
}";
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
XmlDocument newDoc = JsonConvert.DeserializeXmlNode(json, "myRoot");
Assert.AreEqual(@"113150assets/images/resized/0001/1070/11070v1-max-150x150.jpg189250assets/images/resized/0001/1070/11070v1-max-250x250.jpg341450assets/images/resized/0001/1070/11070v1-max-450x450.jpg", newDoc.InnerXml);
@@ -1726,7 +1742,7 @@ public void MultipleNestedArraysToXml()
#endif
}
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void Encoding()
{
@@ -1741,7 +1757,7 @@ public void Encoding()
}
#endif
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeComment()
{
@@ -2792,7 +2808,7 @@ public void DeserializeXNodeDefaultNamespace()
}
#endif
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeXmlNodeDefaultNamespace()
{
@@ -3120,7 +3136,7 @@ public void SerializeAndDeserializeXElementWithNamespaceInChildrenRootDontHaveNa
}
#endif
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeAndDeserializeXmlElementWithNamespaceInChildrenRootDontHaveNameSpace()
{
@@ -3139,7 +3155,7 @@ public void SerializeAndDeserializeXmlElementWithNamespaceInChildrenRootDontHave
Assert.AreEqual(@"AsdAAAadad", xmlBack.OuterXml);
}
-#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeBigInteger()
{
diff --git a/Src/Newtonsoft.Json.Tests/DemoTests.cs b/Src/Newtonsoft.Json.Tests/DemoTests.cs
index 51b781243..5c24ed448 100644
--- a/Src/Newtonsoft.Json.Tests/DemoTests.cs
+++ b/Src/Newtonsoft.Json.Tests/DemoTests.cs
@@ -24,11 +24,11 @@
#endregion
using System;
-#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Buffers;
#endif
using System.Collections.Generic;
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Data;
#endif
using System.IO;
@@ -596,7 +596,7 @@ public void MergeJson()
}", json);
}
-#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void ArrayPooling()
{
@@ -614,7 +614,7 @@ public void ArrayPooling()
}
#endif
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeDataTable()
{
@@ -681,7 +681,7 @@ public void JsonPathRegex()
Assert.AreEqual(1, newtonsoftPackages.Count);
}
-#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public async Task AsyncDemo()
{
@@ -705,7 +705,7 @@ public async Task AsyncDemo()
#endif
}
-#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class JsonArrayPool : IArrayPool
{
public static readonly JsonArrayPool Instance = new JsonArrayPool();
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/ConditionalPropertiesTests.cs b/Src/Newtonsoft.Json.Tests/Documentation/ConditionalPropertiesTests.cs
index a5eae45ea..ce45016da 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/ConditionalPropertiesTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/ConditionalPropertiesTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
using System.ComponentModel;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/ConvertingJsonAndXmlTests.cs b/Src/Newtonsoft.Json.Tests/Documentation/ConvertingJsonAndXmlTests.cs
index b3e0486ca..633211862 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/ConvertingJsonAndXmlTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/ConvertingJsonAndXmlTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET35 || NET20 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET35 || NET20 || PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
using System.ComponentModel;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/JsonSchemaTests.cs b/Src/Newtonsoft.Json.Tests/Documentation/JsonSchemaTests.cs
index bccc3cfde..29fb5f4ca 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/JsonSchemaTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/JsonSchemaTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET40 || NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET40 || NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
#pragma warning disable 618
using System;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/LinqToJsonTests.cs b/Src/Newtonsoft.Json.Tests/Documentation/LinqToJsonTests.cs
index 60efb478e..af55e482d 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/LinqToJsonTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/LinqToJsonTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET35 || NET20 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET35 || NET20 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
using System.ComponentModel;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/PerformanceTests.cs b/Src/Newtonsoft.Json.Tests/Documentation/PerformanceTests.cs
index 93f549bf9..f290a5b4b 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/PerformanceTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/PerformanceTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET40 || NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET40 || NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
using System.ComponentModel;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/ReadingAndWritingJsonTests.cs b/Src/Newtonsoft.Json.Tests/Documentation/ReadingAndWritingJsonTests.cs
index f01b19380..f154abf1a 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/ReadingAndWritingJsonTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/ReadingAndWritingJsonTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET40 || NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET40 || NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
using System.ComponentModel;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Json/CustomJsonReader.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Json/CustomJsonReader.cs
index 3c5dc7168..2cf77075f 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Json/CustomJsonReader.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Json/CustomJsonReader.cs
@@ -39,7 +39,7 @@
#endif
-#if !(DNXCORE50 || NET20) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(DNXCORE50 || NET20) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
namespace Newtonsoft.Json.Tests.Documentation.Samples.Json
{
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Json/CustomJsonWriter.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Json/CustomJsonWriter.cs
index 010bd3b7a..51860f956 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Json/CustomJsonWriter.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Json/CustomJsonWriter.cs
@@ -39,7 +39,7 @@
#endif
-#if !(DNXCORE50 || NET20) || NETSTANDARD2_0
+#if !(DNXCORE50 || NET20) || NETSTANDARD2_0 || NET6_0_OR_GREATER
namespace Newtonsoft.Json.Tests.Documentation.Samples.Json
{
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Linq/DeserializeWithLinq.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Linq/DeserializeWithLinq.cs
index 4a1bd9d39..0192f6d07 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Linq/DeserializeWithLinq.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Linq/DeserializeWithLinq.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !DNXCORE50 || NETSTANDARD2_0
+#if !DNXCORE50 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Linq/SerializeWithLinq.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Linq/SerializeWithLinq.cs
index 89701f8a9..18c59428a 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Linq/SerializeWithLinq.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Linq/SerializeWithLinq.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !DNXCORE50 || NETSTANDARD2_0
+#if !DNXCORE50 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/CustomTraceWriter.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/CustomTraceWriter.cs
index c764505bd..b3306dde8 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/CustomTraceWriter.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/CustomTraceWriter.cs
@@ -37,7 +37,7 @@
#endif
-#if !(DNXCORE50 || NET20 || NET35) || NETSTANDARD2_0
+#if !(DNXCORE50 || NET20 || NET35) || NETSTANDARD2_0 || NET6_0_OR_GREATER
namespace Newtonsoft.Json.Tests.Documentation.Samples.Serializer
{
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeDataSet.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeDataSet.cs
index 78e65c637..ec7605bea 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeDataSet.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeDataSet.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(DNXCORE50 || PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(DNXCORE50 || PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeDateFormatString.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeDateFormatString.cs
index dc7a0f0d1..1818ae686 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeDateFormatString.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeDateFormatString.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !DNXCORE50 || NETSTANDARD2_0
+#if !DNXCORE50 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeWithDependencyInjection.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeWithDependencyInjection.cs
index faceabe97..c15e3eb08 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeWithDependencyInjection.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/DeserializeWithDependencyInjection.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET20 || NET35 || NET40 || DNXCORE50 || PORTABLE40 || PORTABLE) || NETSTANDARD1_0 || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || NET40 || DNXCORE50 || PORTABLE40 || PORTABLE) || NETSTANDARD1_0 || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyKebabCase.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyKebabCase.cs
new file mode 100644
index 000000000..dfe50dba3
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/NamingStrategyKebabCase.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 NamingStrategyKebabCase : 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 KebabCaseNamingStrategy()
+ };
+
+ 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/Documentation/Samples/Serializer/SerializeDataSet.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/SerializeDataSet.cs
index 45f7dcb86..a4ccdebc2 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/SerializeDataSet.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Serializer/SerializeDataSet.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(DNXCORE50 || PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(DNXCORE50 || PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Xml/ConvertXmlToJson.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Xml/ConvertXmlToJson.cs
index 25c4c4293..856f8cbcb 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Xml/ConvertXmlToJson.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Xml/ConvertXmlToJson.cs
@@ -36,7 +36,7 @@
#endif
-#if !(DNXCORE50 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(DNXCORE50 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
namespace Newtonsoft.Json.Tests.Documentation.Samples.Xml
{
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Xml/ConvertXmlToJsonForceArray.cs b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Xml/ConvertXmlToJsonForceArray.cs
index aeaf7fef3..35b0a3eda 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/Samples/Xml/ConvertXmlToJsonForceArray.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/Samples/Xml/ConvertXmlToJsonForceArray.cs
@@ -36,7 +36,7 @@
#endif
-#if !(NET20 || DNXCORE50 || PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(NET20 || DNXCORE50 || PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
namespace Newtonsoft.Json.Tests.Documentation.Samples.Xml
{
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/SerializationTests.cs b/Src/Newtonsoft.Json.Tests/Documentation/SerializationTests.cs
index fbfbd3a8e..5bb3c6d5a 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/SerializationTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/SerializationTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD2_0
+#if !(NET35 || NET20 || PORTABLE || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
using System.ComponentModel;
diff --git a/Src/Newtonsoft.Json.Tests/Documentation/TraceWriterTests.cs b/Src/Newtonsoft.Json.Tests/Documentation/TraceWriterTests.cs
index b40faea68..c7837e315 100644
--- a/Src/Newtonsoft.Json.Tests/Documentation/TraceWriterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Documentation/TraceWriterTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET35 || NET20 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET35 || NET20 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
using System.ComponentModel;
diff --git a/Src/Newtonsoft.Json.Tests/ExceptionTests.cs b/Src/Newtonsoft.Json.Tests/ExceptionTests.cs
index ce93ecd05..85714d7af 100644
--- a/Src/Newtonsoft.Json.Tests/ExceptionTests.cs
+++ b/Src/Newtonsoft.Json.Tests/ExceptionTests.cs
@@ -25,7 +25,7 @@
using System;
using System.IO;
-#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Runtime.Serialization.Formatters.Binary;
#endif
using Newtonsoft.Json.Schema;
@@ -105,7 +105,7 @@ public void JsonSchemaException()
}
#pragma warning restore 618
-#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void BinarySerializeException()
{
@@ -113,7 +113,9 @@ public void BinarySerializeException()
using (var memoryStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter();
+#pragma warning disable SYSLIB0011 // Type or member is obsolete
binaryFormatter.Serialize(memoryStream, exception);
+#pragma warning restore SYSLIB0011 // Type or member is obsolete
}
}
#endif
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1327.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1327.cs
index 0d2f665a6..674364110 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1327.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1327.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections.Generic;
using System.Linq;
@@ -47,7 +47,7 @@ namespace Newtonsoft.Json.Tests.Issues
[TestFixture]
public class Issue1327 : TestFixtureBase
{
-#if !PORTABLE || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class PersonWithXmlNode
{
public XmlNode TestXml { get; set; }
@@ -71,7 +71,7 @@ public class PersonWithXObject
}
#endif
-#if !PORTABLE || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void Test_XmlNode()
{
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1404.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1404.cs
index 51025c164..a0ec4ad9a 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1404.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1404.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if NETSTANDARD2_0
+#if NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Data;
using System.IO;
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1445.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1445.cs
index a641f44ea..72d4fa189 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1445.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1445.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(PORTABLE) || NETSTANDARD2_0
+#if !(PORTABLE) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Data;
using System.Linq;
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1569.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1569.cs
index d2552b831..f346fade7 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1569.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1569.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || NET40 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.IO;
using System.Text;
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1597.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1597.cs
index 4d2bdda53..91a8d4373 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1597.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1597.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET20 || NET35 || NET40 || PORTABLE40 || PORTABLE) || NETSTANDARD1_0 || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || NET40 || PORTABLE40 || PORTABLE) || NETSTANDARD1_0 || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System;
using System.Collections;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1620.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1620.cs
index 0101e813e..6f673f963 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1620.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1620.cs
@@ -36,7 +36,7 @@
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Utilities;
-#if PORTABLE && !NETSTANDARD2_0
+#if PORTABLE && !(NETSTANDARD2_0 || NET6_0_OR_GREATER)
using BindingFlags = Newtonsoft.Json.Utilities.BindingFlags;
#else
using BindingFlags = System.Reflection.BindingFlags;
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1734.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1734.cs
index a84475196..ec8724dc1 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1734.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1734.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Linq.JsonPath;
using System;
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1757.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1757.cs
index 83704f5ab..d1af5c88e 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1757.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1757.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if (NETSTANDARD2_0)
+#if (NETSTANDARD2_0 || NET6_0_OR_GREATER)
using System;
using System.Collections;
using System.Collections.Generic;
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1798.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1798.cs
index b311871cf..1a8c7dc0e 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1798.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1798.cs
@@ -90,7 +90,7 @@ public void Test_DefaultContractResolver()
var objectContract = (JsonObjectContract) resolver.ResolveContract(typeof(NonSerializableException));
Assert.IsFalse(objectContract.Properties.Contains("TargetSite"));
-#if (PORTABLE40 || PORTABLE || NETSTANDARD1_3) && !NETSTANDARD2_0
+#if (PORTABLE40 || PORTABLE) && !(NETSTANDARD2_0 || NETSTANDARD1_3 || NET6_0_OR_GREATER)
objectContract = (JsonObjectContract) resolver.ResolveContract(typeof(Exception));
Assert.IsFalse(objectContract.Properties.Contains("TargetSite"));
#else
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1962.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1962.cs
new file mode 100644
index 000000000..b9c144e0e
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1962.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.Linq;
+using Newtonsoft.Json.Linq;
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+#else
+using NUnit.Framework;
+#endif
+
+namespace Newtonsoft.Json.Tests.Issues
+{
+ [TestFixture]
+ public class Issue1962
+ {
+ [Test]
+ public void Test_Default()
+ {
+ string json = @"// comment
+[ 1, 2, 42 ]";
+ JToken token = JToken.Parse(json);
+
+ Assert.AreEqual(JTokenType.Comment, token.Type);
+ Assert.AreEqual(" comment", ((JValue)token).Value);
+ }
+
+ [Test]
+ public void Test_LoadComments()
+ {
+ string json = @"// comment
+[ 1, 2, 42 ]";
+ JToken token = JToken.Parse(json, new JsonLoadSettings
+ {
+ CommentHandling = CommentHandling.Load
+ });
+
+ Assert.AreEqual(JTokenType.Comment, token.Type);
+ Assert.AreEqual(" comment", ((JValue)token).Value);
+
+ int[] obj = token.ToObject();
+ Assert.IsNull(obj);
+ }
+
+ [Test]
+ public void Test_IgnoreComments()
+ {
+ string json = @"// comment
+[ 1, 2, 42 ]";
+ JToken token = JToken.Parse(json, new JsonLoadSettings
+ {
+ CommentHandling = CommentHandling.Ignore
+ });
+
+ Assert.AreEqual(JTokenType.Array, token.Type);
+ Assert.AreEqual(3, token.Count());
+ Assert.AreEqual(1, (int)token[0]);
+ Assert.AreEqual(2, (int)token[1]);
+ Assert.AreEqual(42, (int)token[2]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue1984.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue1984.cs
index e552cbf28..0dde517c5 100644
--- a/Src/Newtonsoft.Json.Tests/Issues/Issue1984.cs
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue1984.cs
@@ -37,6 +37,7 @@
namespace Newtonsoft.Json.Tests.Issues
{
+ [TestFixture]
public class Issue1984
{
[Test]
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue2082.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue2082.cs
new file mode 100644
index 000000000..f69ae3c1e
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue2082.cs
@@ -0,0 +1,76 @@
+#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
+
+#if !NET20
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+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.Issues
+{
+ [TestFixture]
+ public class Issue2082
+ {
+ [Test]
+ public void Test()
+ {
+ CamelCaseNamingStrategy namingStrategy = new CamelCaseNamingStrategy(processDictionaryKeys: true, overrideSpecifiedNames: false);
+
+ TestClass c = new TestClass { Value = TestEnum.UpperCaseName };
+ string json = JsonConvert.SerializeObject(c, new JsonSerializerSettings
+ {
+ ContractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = namingStrategy
+ },
+ Converters = new[] { new StringEnumConverter { NamingStrategy = namingStrategy } }
+ });
+
+ Assert.AreEqual(@"{""value"":""UPPER_CASE_NAME""}", json);
+ }
+
+ public class TestClass
+ {
+ public TestEnum Value { get; set; }
+ }
+
+ public enum TestEnum
+ {
+ [EnumMember(Value = "UPPER_CASE_NAME")]
+ UpperCaseName
+ }
+ }
+}
+#endif
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue2156.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue2156.cs
new file mode 100644
index 000000000..b04354319
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue2156.cs
@@ -0,0 +1,65 @@
+#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 Newtonsoft.Json.Linq;
+using System.Linq;
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+#else
+using NUnit.Framework;
+#endif
+
+namespace Newtonsoft.Json.Tests.Issues
+{
+ [TestFixture]
+ public class Issue2156
+ {
+ [Test]
+ public void Test()
+ {
+ string json = @"
+ {
+ ""root"": {
+ ""a"": {
+ ""name"": ""John"",
+ ""b"": {
+ ""name"": ""Sarah""
+ }
+ }
+ }
+ }";
+
+ JToken t = JToken.Parse(json);
+
+ int count1 = t.SelectTokens("$..a.name").Count(); // result: 1, expected: 1
+ int count2 = t.SelectTokens("$..['a']['name']").Count(); // result: 2, expected: 1
+
+ Assert.AreEqual(1, count1);
+ Assert.AreEqual(1, count2);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue2165.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue2165.cs
new file mode 100644
index 000000000..64071d4e4
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue2165.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.IO;
+#if !(NET20 || NET35 || NET40 || PORTABLE40)
+using System.Threading.Tasks;
+#endif
+using Newtonsoft.Json.Linq;
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+#else
+using NUnit.Framework;
+#endif
+
+namespace Newtonsoft.Json.Tests.Issues
+{
+ [TestFixture]
+ public class Issue2165
+ {
+ [Test]
+ public void Test_Deserializer()
+ {
+ ExceptionAssert.Throws(
+ () => JsonConvert.DeserializeObject("{"),
+ "Unexpected end when reading token. Path ''.");
+ }
+
+ [Test]
+ public void Test()
+ {
+ StringWriter w = new StringWriter();
+ JsonTextWriter writer = new JsonTextWriter(w);
+
+ var jsonReader = new JsonTextReader(new StringReader("{"));
+ jsonReader.Read();
+
+ ExceptionAssert.Throws(
+ () => writer.WriteToken(jsonReader),
+ "Unexpected end when reading token. Path ''.");
+ }
+
+#if !(NET20 || NET35 || NET40 || PORTABLE40)
+ [Test]
+ public async Task TestAsync()
+ {
+ StringWriter w = new StringWriter();
+ JsonTextWriter writer = new JsonTextWriter(w);
+
+ var jsonReader = new JsonTextReader(new StringReader("{"));
+ await jsonReader.ReadAsync();
+
+ await ExceptionAssert.ThrowsAsync(
+ () => writer.WriteTokenAsync(jsonReader),
+ "Unexpected end when reading token. Path ''.");
+ }
+#endif
+ }
+}
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue2176.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue2176.cs
new file mode 100644
index 000000000..a0f42bd30
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue2176.cs
@@ -0,0 +1,576 @@
+#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
+
+#if !(NETSTANDARD1_0 || NETSTANDARD1_3)
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+#else
+using NUnit.Framework;
+#endif
+
+namespace Newtonsoft.Json.Tests.Issues
+{
+ [TestFixture]
+ public class Issue2176
+ {
+ [Test]
+ public void Test()
+ {
+ Dummy o = JsonConvert.DeserializeObject(Json);
+ Assert.AreEqual(0, o.P0);
+ Assert.AreEqual(256, o.P256);
+ }
+
+ public class Dummy
+ {
+ public int P0 { get; }
+ public int P1 { get; }
+ public int P2 { get; }
+ public int P3 { get; }
+ public int P4 { get; }
+ public int P5 { get; }
+ public int P6 { get; }
+ public int P7 { get; }
+ public int P8 { get; }
+ public int P9 { get; }
+ public int P10 { get; }
+ public int P11 { get; }
+ public int P12 { get; }
+ public int P13 { get; }
+ public int P14 { get; }
+ public int P15 { get; }
+ public int P16 { get; }
+ public int P17 { get; }
+ public int P18 { get; }
+ public int P19 { get; }
+ public int P20 { get; }
+ public int P21 { get; }
+ public int P22 { get; }
+ public int P23 { get; }
+ public int P24 { get; }
+ public int P25 { get; }
+ public int P26 { get; }
+ public int P27 { get; }
+ public int P28 { get; }
+ public int P29 { get; }
+ public int P30 { get; }
+ public int P31 { get; }
+ public int P32 { get; }
+ public int P33 { get; }
+ public int P34 { get; }
+ public int P35 { get; }
+ public int P36 { get; }
+ public int P37 { get; }
+ public int P38 { get; }
+ public int P39 { get; }
+ public int P40 { get; }
+ public int P41 { get; }
+ public int P42 { get; }
+ public int P43 { get; }
+ public int P44 { get; }
+ public int P45 { get; }
+ public int P46 { get; }
+ public int P47 { get; }
+ public int P48 { get; }
+ public int P49 { get; }
+ public int P50 { get; }
+ public int P51 { get; }
+ public int P52 { get; }
+ public int P53 { get; }
+ public int P54 { get; }
+ public int P55 { get; }
+ public int P56 { get; }
+ public int P57 { get; }
+ public int P58 { get; }
+ public int P59 { get; }
+ public int P60 { get; }
+ public int P61 { get; }
+ public int P62 { get; }
+ public int P63 { get; }
+ public int P64 { get; }
+ public int P65 { get; }
+ public int P66 { get; }
+ public int P67 { get; }
+ public int P68 { get; }
+ public int P69 { get; }
+ public int P70 { get; }
+ public int P71 { get; }
+ public int P72 { get; }
+ public int P73 { get; }
+ public int P74 { get; }
+ public int P75 { get; }
+ public int P76 { get; }
+ public int P77 { get; }
+ public int P78 { get; }
+ public int P79 { get; }
+ public int P80 { get; }
+ public int P81 { get; }
+ public int P82 { get; }
+ public int P83 { get; }
+ public int P84 { get; }
+ public int P85 { get; }
+ public int P86 { get; }
+ public int P87 { get; }
+ public int P88 { get; }
+ public int P89 { get; }
+ public int P90 { get; }
+ public int P91 { get; }
+ public int P92 { get; }
+ public int P93 { get; }
+ public int P94 { get; }
+ public int P95 { get; }
+ public int P96 { get; }
+ public int P97 { get; }
+ public int P98 { get; }
+ public int P99 { get; }
+ public int P100 { get; }
+ public int P101 { get; }
+ public int P102 { get; }
+ public int P103 { get; }
+ public int P104 { get; }
+ public int P105 { get; }
+ public int P106 { get; }
+ public int P107 { get; }
+ public int P108 { get; }
+ public int P109 { get; }
+ public int P110 { get; }
+ public int P111 { get; }
+ public int P112 { get; }
+ public int P113 { get; }
+ public int P114 { get; }
+ public int P115 { get; }
+ public int P116 { get; }
+ public int P117 { get; }
+ public int P118 { get; }
+ public int P119 { get; }
+ public int P120 { get; }
+ public int P121 { get; }
+ public int P122 { get; }
+ public int P123 { get; }
+ public int P124 { get; }
+ public int P125 { get; }
+ public int P126 { get; }
+ public int P127 { get; }
+ public int P128 { get; }
+ public int P129 { get; }
+ public int P130 { get; }
+ public int P131 { get; }
+ public int P132 { get; }
+ public int P133 { get; }
+ public int P134 { get; }
+ public int P135 { get; }
+ public int P136 { get; }
+ public int P137 { get; }
+ public int P138 { get; }
+ public int P139 { get; }
+ public int P140 { get; }
+ public int P141 { get; }
+ public int P142 { get; }
+ public int P143 { get; }
+ public int P144 { get; }
+ public int P145 { get; }
+ public int P146 { get; }
+ public int P147 { get; }
+ public int P148 { get; }
+ public int P149 { get; }
+ public int P150 { get; }
+ public int P151 { get; }
+ public int P152 { get; }
+ public int P153 { get; }
+ public int P154 { get; }
+ public int P155 { get; }
+ public int P156 { get; }
+ public int P157 { get; }
+ public int P158 { get; }
+ public int P159 { get; }
+ public int P160 { get; }
+ public int P161 { get; }
+ public int P162 { get; }
+ public int P163 { get; }
+ public int P164 { get; }
+ public int P165 { get; }
+ public int P166 { get; }
+ public int P167 { get; }
+ public int P168 { get; }
+ public int P169 { get; }
+ public int P170 { get; }
+ public int P171 { get; }
+ public int P172 { get; }
+ public int P173 { get; }
+ public int P174 { get; }
+ public int P175 { get; }
+ public int P176 { get; }
+ public int P177 { get; }
+ public int P178 { get; }
+ public int P179 { get; }
+ public int P180 { get; }
+ public int P181 { get; }
+ public int P182 { get; }
+ public int P183 { get; }
+ public int P184 { get; }
+ public int P185 { get; }
+ public int P186 { get; }
+ public int P187 { get; }
+ public int P188 { get; }
+ public int P189 { get; }
+ public int P190 { get; }
+ public int P191 { get; }
+ public int P192 { get; }
+ public int P193 { get; }
+ public int P194 { get; }
+ public int P195 { get; }
+ public int P196 { get; }
+ public int P197 { get; }
+ public int P198 { get; }
+ public int P199 { get; }
+ public int P200 { get; }
+ public int P201 { get; }
+ public int P202 { get; }
+ public int P203 { get; }
+ public int P204 { get; }
+ public int P205 { get; }
+ public int P206 { get; }
+ public int P207 { get; }
+ public int P208 { get; }
+ public int P209 { get; }
+ public int P210 { get; }
+ public int P211 { get; }
+ public int P212 { get; }
+ public int P213 { get; }
+ public int P214 { get; }
+ public int P215 { get; }
+ public int P216 { get; }
+ public int P217 { get; }
+ public int P218 { get; }
+ public int P219 { get; }
+ public int P220 { get; }
+ public int P221 { get; }
+ public int P222 { get; }
+ public int P223 { get; }
+ public int P224 { get; }
+ public int P225 { get; }
+ public int P226 { get; }
+ public int P227 { get; }
+ public int P228 { get; }
+ public int P229 { get; }
+ public int P230 { get; }
+ public int P231 { get; }
+ public int P232 { get; }
+ public int P233 { get; }
+ public int P234 { get; }
+ public int P235 { get; }
+ public int P236 { get; }
+ public int P237 { get; }
+ public int P238 { get; }
+ public int P239 { get; }
+ public int P240 { get; }
+ public int P241 { get; }
+ public int P242 { get; }
+ public int P243 { get; }
+ public int P244 { get; }
+ public int P245 { get; }
+ public int P246 { get; }
+ public int P247 { get; }
+ public int P248 { get; }
+ public int P249 { get; }
+ public int P250 { get; }
+ public int P251 { get; }
+ public int P252 { get; }
+ public int P253 { get; }
+ public int P254 { get; }
+ public int P255 { get; }
+ public int P256 { get; }
+
+ public Dummy(int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10, int p11, int p12, int p13, int p14, int p15, int p16, int p17, int p18, int p19, int p20, int p21, int p22, int p23, int p24, int p25, int p26, int p27, int p28, int p29, int p30, int p31, int p32, int p33, int p34, int p35, int p36, int p37, int p38, int p39, int p40, int p41, int p42, int p43, int p44, int p45, int p46, int p47, int p48, int p49, int p50, int p51, int p52, int p53, int p54, int p55, int p56, int p57, int p58, int p59, int p60, int p61, int p62, int p63, int p64, int p65, int p66, int p67, int p68, int p69, int p70, int p71, int p72, int p73, int p74, int p75, int p76, int p77, int p78, int p79, int p80, int p81, int p82, int p83, int p84, int p85, int p86, int p87, int p88, int p89, int p90, int p91, int p92, int p93, int p94, int p95, int p96, int p97, int p98, int p99, int p100, int p101, int p102, int p103, int p104, int p105, int p106, int p107, int p108, int p109, int p110, int p111, int p112, int p113, int p114, int p115, int p116, int p117, int p118, int p119, int p120, int p121, int p122, int p123, int p124, int p125, int p126, int p127, int p128, int p129, int p130, int p131, int p132, int p133, int p134, int p135, int p136, int p137, int p138, int p139, int p140, int p141, int p142, int p143, int p144, int p145, int p146, int p147, int p148, int p149, int p150, int p151, int p152, int p153, int p154, int p155, int p156, int p157, int p158, int p159, int p160, int p161, int p162, int p163, int p164, int p165, int p166, int p167, int p168, int p169, int p170, int p171, int p172, int p173, int p174, int p175, int p176, int p177, int p178, int p179, int p180, int p181, int p182, int p183, int p184, int p185, int p186, int p187, int p188, int p189, int p190, int p191, int p192, int p193, int p194, int p195, int p196, int p197, int p198, int p199, int p200, int p201, int p202, int p203, int p204, int p205, int p206, int p207, int p208, int p209, int p210, int p211, int p212, int p213, int p214, int p215, int p216, int p217, int p218, int p219, int p220, int p221, int p222, int p223, int p224, int p225, int p226, int p227, int p228, int p229, int p230, int p231, int p232, int p233, int p234, int p235, int p236, int p237, int p238, int p239, int p240, int p241, int p242, int p243, int p244, int p245, int p246, int p247, int p248, int p249, int p250, int p251, int p252, int p253, int p254, int p255, int p256)
+ {
+ P0 = p0;
+ P256 = p256;
+ }
+ }
+
+ public const string Json = @"{
+ ""p0"" : 0,
+ ""p1"" : 1,
+ ""p2"" : 2,
+ ""p3"" : 3,
+ ""p4"" : 4,
+ ""p5"" : 5,
+ ""p6"" : 6,
+ ""p7"" : 7,
+ ""p8"" : 8,
+ ""p9"" : 9,
+ ""p10"" : 10,
+ ""p11"" : 11,
+ ""p12"" : 12,
+ ""p13"" : 13,
+ ""p14"" : 14,
+ ""p15"" : 15,
+ ""p16"" : 16,
+ ""p17"" : 17,
+ ""p18"" : 18,
+ ""p19"" : 19,
+ ""p20"" : 20,
+ ""p21"" : 21,
+ ""p22"" : 22,
+ ""p23"" : 23,
+ ""p24"" : 24,
+ ""p25"" : 25,
+ ""p26"" : 26,
+ ""p27"" : 27,
+ ""p28"" : 28,
+ ""p29"" : 29,
+ ""p30"" : 30,
+ ""p31"" : 31,
+ ""p32"" : 32,
+ ""p33"" : 33,
+ ""p34"" : 34,
+ ""p35"" : 35,
+ ""p36"" : 36,
+ ""p37"" : 37,
+ ""p38"" : 38,
+ ""p39"" : 39,
+ ""p40"" : 40,
+ ""p41"" : 41,
+ ""p42"" : 42,
+ ""p43"" : 43,
+ ""p44"" : 44,
+ ""p45"" : 45,
+ ""p46"" : 46,
+ ""p47"" : 47,
+ ""p48"" : 48,
+ ""p49"" : 49,
+ ""p50"" : 50,
+ ""p51"" : 51,
+ ""p52"" : 52,
+ ""p53"" : 53,
+ ""p54"" : 54,
+ ""p55"" : 55,
+ ""p56"" : 56,
+ ""p57"" : 57,
+ ""p58"" : 58,
+ ""p59"" : 59,
+ ""p60"" : 60,
+ ""p61"" : 61,
+ ""p62"" : 62,
+ ""p63"" : 63,
+ ""p64"" : 64,
+ ""p65"" : 65,
+ ""p66"" : 66,
+ ""p67"" : 67,
+ ""p68"" : 68,
+ ""p69"" : 69,
+ ""p70"" : 70,
+ ""p71"" : 71,
+ ""p72"" : 72,
+ ""p73"" : 73,
+ ""p74"" : 74,
+ ""p75"" : 75,
+ ""p76"" : 76,
+ ""p77"" : 77,
+ ""p78"" : 78,
+ ""p79"" : 79,
+ ""p80"" : 80,
+ ""p81"" : 81,
+ ""p82"" : 82,
+ ""p83"" : 83,
+ ""p84"" : 84,
+ ""p85"" : 85,
+ ""p86"" : 86,
+ ""p87"" : 87,
+ ""p88"" : 88,
+ ""p89"" : 89,
+ ""p90"" : 90,
+ ""p91"" : 91,
+ ""p92"" : 92,
+ ""p93"" : 93,
+ ""p94"" : 94,
+ ""p95"" : 95,
+ ""p96"" : 96,
+ ""p97"" : 97,
+ ""p98"" : 98,
+ ""p99"" : 99,
+ ""p100"" : 100,
+ ""p101"" : 101,
+ ""p102"" : 102,
+ ""p103"" : 103,
+ ""p104"" : 104,
+ ""p105"" : 105,
+ ""p106"" : 106,
+ ""p107"" : 107,
+ ""p108"" : 108,
+ ""p109"" : 109,
+ ""p110"" : 110,
+ ""p111"" : 111,
+ ""p112"" : 112,
+ ""p113"" : 113,
+ ""p114"" : 114,
+ ""p115"" : 115,
+ ""p116"" : 116,
+ ""p117"" : 117,
+ ""p118"" : 118,
+ ""p119"" : 119,
+ ""p120"" : 120,
+ ""p121"" : 121,
+ ""p122"" : 122,
+ ""p123"" : 123,
+ ""p124"" : 124,
+ ""p125"" : 125,
+ ""p126"" : 126,
+ ""p127"" : 127,
+ ""p128"" : 128,
+ ""p129"" : 129,
+ ""p130"" : 130,
+ ""p131"" : 131,
+ ""p132"" : 132,
+ ""p133"" : 133,
+ ""p134"" : 134,
+ ""p135"" : 135,
+ ""p136"" : 136,
+ ""p137"" : 137,
+ ""p138"" : 138,
+ ""p139"" : 139,
+ ""p140"" : 140,
+ ""p141"" : 141,
+ ""p142"" : 142,
+ ""p143"" : 143,
+ ""p144"" : 144,
+ ""p145"" : 145,
+ ""p146"" : 146,
+ ""p147"" : 147,
+ ""p148"" : 148,
+ ""p149"" : 149,
+ ""p150"" : 150,
+ ""p151"" : 151,
+ ""p152"" : 152,
+ ""p153"" : 153,
+ ""p154"" : 154,
+ ""p155"" : 155,
+ ""p156"" : 156,
+ ""p157"" : 157,
+ ""p158"" : 158,
+ ""p159"" : 159,
+ ""p160"" : 160,
+ ""p161"" : 161,
+ ""p162"" : 162,
+ ""p163"" : 163,
+ ""p164"" : 164,
+ ""p165"" : 165,
+ ""p166"" : 166,
+ ""p167"" : 167,
+ ""p168"" : 168,
+ ""p169"" : 169,
+ ""p170"" : 170,
+ ""p171"" : 171,
+ ""p172"" : 172,
+ ""p173"" : 173,
+ ""p174"" : 174,
+ ""p175"" : 175,
+ ""p176"" : 176,
+ ""p177"" : 177,
+ ""p178"" : 178,
+ ""p179"" : 179,
+ ""p180"" : 180,
+ ""p181"" : 181,
+ ""p182"" : 182,
+ ""p183"" : 183,
+ ""p184"" : 184,
+ ""p185"" : 185,
+ ""p186"" : 186,
+ ""p187"" : 187,
+ ""p188"" : 188,
+ ""p189"" : 189,
+ ""p190"" : 190,
+ ""p191"" : 191,
+ ""p192"" : 192,
+ ""p193"" : 193,
+ ""p194"" : 194,
+ ""p195"" : 195,
+ ""p196"" : 196,
+ ""p197"" : 197,
+ ""p198"" : 198,
+ ""p199"" : 199,
+ ""p200"" : 200,
+ ""p201"" : 201,
+ ""p202"" : 202,
+ ""p203"" : 203,
+ ""p204"" : 204,
+ ""p205"" : 205,
+ ""p206"" : 206,
+ ""p207"" : 207,
+ ""p208"" : 208,
+ ""p209"" : 209,
+ ""p210"" : 210,
+ ""p211"" : 211,
+ ""p212"" : 212,
+ ""p213"" : 213,
+ ""p214"" : 214,
+ ""p215"" : 215,
+ ""p216"" : 216,
+ ""p217"" : 217,
+ ""p218"" : 218,
+ ""p219"" : 219,
+ ""p220"" : 220,
+ ""p221"" : 221,
+ ""p222"" : 222,
+ ""p223"" : 223,
+ ""p224"" : 224,
+ ""p225"" : 225,
+ ""p226"" : 226,
+ ""p227"" : 227,
+ ""p228"" : 228,
+ ""p229"" : 229,
+ ""p230"" : 230,
+ ""p231"" : 231,
+ ""p232"" : 232,
+ ""p233"" : 233,
+ ""p234"" : 234,
+ ""p235"" : 235,
+ ""p236"" : 236,
+ ""p237"" : 237,
+ ""p238"" : 238,
+ ""p239"" : 239,
+ ""p240"" : 240,
+ ""p241"" : 241,
+ ""p242"" : 242,
+ ""p243"" : 243,
+ ""p244"" : 244,
+ ""p245"" : 245,
+ ""p246"" : 246,
+ ""p247"" : 247,
+ ""p248"" : 248,
+ ""p249"" : 249,
+ ""p250"" : 250,
+ ""p251"" : 251,
+ ""p252"" : 252,
+ ""p253"" : 253,
+ ""p254"" : 254,
+ ""p255"" : 255,
+ ""p256"" : 256,
+}";
+ }
+}
+#endif
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue2444.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue2444.cs
new file mode 100644
index 000000000..4932d15f7
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue2444.cs
@@ -0,0 +1,88 @@
+#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
+
+#if !(NETSTANDARD1_0 || NETSTANDARD1_3)
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+#else
+using NUnit.Framework;
+#endif
+using System.Collections.Generic;
+using Newtonsoft.Json.Serialization;
+using Newtonsoft.Json.Converters;
+
+namespace Newtonsoft.Json.Tests.Issues
+{
+ [TestFixture]
+ public class Issue2444
+ {
+ [Test]
+ public void Test()
+ {
+ var namingStrategy = new SnakeCaseNamingStrategy();
+ var settings = new JsonSerializerSettings
+ {
+ ContractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = namingStrategy
+ }
+ };
+
+ string json = @"{""dict"":{""value1"":""a"",""text_value"":""b""}}";
+ DataClass c = JsonConvert.DeserializeObject(json, settings);
+
+ Assert.AreEqual(2, c.Dict.Count);
+ Assert.AreEqual("a", c.Dict[MyEnum.Value1]);
+ Assert.AreEqual("b", c.Dict[MyEnum.TextValue]);
+
+ string json1 = @"{""dict"":{""Value1"":""a"",""TextValue"":""b""}}";
+ DataClass c1 = JsonConvert.DeserializeObject(json1, settings);
+
+ Assert.AreEqual(2, c1.Dict.Count);
+ Assert.AreEqual("a", c1.Dict[MyEnum.Value1]);
+ Assert.AreEqual("b", c1.Dict[MyEnum.TextValue]);
+
+ // Non-dictionary values should still error
+ ExceptionAssert.Throws(() =>
+ {
+ JsonConvert.DeserializeObject>(@"[""text_value""]", settings);
+ }, @"Error converting value ""text_value"" to type 'Newtonsoft.Json.Tests.Issues.Issue2444+MyEnum'. Path '[0]', line 1, position 13.");
+ }
+
+ public enum MyEnum
+ {
+ Value1,
+ TextValue
+ }
+
+ public class DataClass
+ {
+ public Dictionary Dict { get; set; }
+ }
+ }
+}
+#endif
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Issues/Issue2450.cs b/Src/Newtonsoft.Json.Tests/Issues/Issue2450.cs
new file mode 100644
index 000000000..ee744c908
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Issues/Issue2450.cs
@@ -0,0 +1,97 @@
+#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
+
+#if (NET45 || NET50)
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+#else
+using NUnit.Framework;
+#endif
+using System.Collections.Generic;
+using Newtonsoft.Json.Serialization;
+using Newtonsoft.Json.Converters;
+using System.Collections;
+using System;
+
+namespace Newtonsoft.Json.Tests.Issues
+{
+ [TestFixture]
+ public class Issue2450
+ {
+ [Test]
+ public void Test()
+ {
+ var resolver = new DefaultContractResolver();
+ JsonContract contract;
+
+ contract = resolver.ResolveContract(typeof(Dict));
+ Assert.IsTrue(contract is JsonDictionaryContract);
+
+ contract = resolver.ResolveContract(typeof(Dict?));
+ Assert.IsTrue(contract is JsonDictionaryContract);
+ }
+
+ [Test]
+ public void Test_Serialize()
+ {
+ Dict d = new Dict(new Dictionary
+ {
+ ["prop1"] = 1,
+ ["prop2"] = 2
+ });
+
+ string json = JsonConvert.SerializeObject(d);
+ Assert.AreEqual(@"{""prop1"":1,""prop2"":2}", json);
+ }
+
+ [Test]
+ public void Test_Deserialize()
+ {
+ string json = @"{""prop1"":1,""prop2"":2}";
+
+ var d = JsonConvert.DeserializeObject(json);
+ Assert.AreEqual(1, d.Value["prop1"]);
+ Assert.AreEqual(2, d.Value["prop2"]);
+ }
+
+ public struct Dict : IReadOnlyDictionary
+ {
+ private readonly IDictionary _dict;
+ public Dict(IDictionary dict) => _dict = dict;
+
+ public object this[string key] => _dict[key];
+ public IEnumerable Keys => _dict.Keys;
+ public IEnumerable
-
-
+
+
@@ -144,8 +100,8 @@
-
-
+
+
@@ -153,65 +109,86 @@
NET20;$(AdditionalConstants)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
Json.NET Tests .NET Standard 2.0
.NETStandard,Version=v2.0
- NETSTANDARD2_0;DNXCORE50;PORTABLE;HAVE_BENCHMARKS;$(AdditionalConstants)
+ NETSTANDARD2_0;DNXCORE50;PORTABLE;HAVE_BENCHMARKS;HAVE_REGEX_TIMEOUTS;$(AdditionalConstants)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Json.NET Tests .NET 6.0
+ net6.0
+ NET6_0;DNXCORE50;PORTABLE;HAVE_BENCHMARKS;HAVE_REGEX_TIMEOUTS;$(AdditionalConstants)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
Json.NET Tests .NET Standard 1.3
.NETStandard,Version=v1.3
- NETSTANDARD1_3;DNXCORE50;PORTABLE;HAVE_BENCHMARKS;$(AdditionalConstants)
+ NETSTANDARD1_3;DNXCORE50;PORTABLE;HAVE_BENCHMARKS;HAVE_REGEX_TIMEOUTS;$(AdditionalConstants)
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
Json.NET Tests .NET Standard 1.0
.NETStandard,Version=v1.0
- NETSTANDARD1_0;DNXCORE50;PORTABLE;$(AdditionalConstants)
+ NETSTANDARD1_0;DNXCORE50;PORTABLE;HAVE_REGEX_TIMEOUTS;$(AdditionalConstants)
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Schema/JsonSchemaGeneratorTests.cs b/Src/Newtonsoft.Json.Tests/Schema/JsonSchemaGeneratorTests.cs
index e98489f6e..d2c6fb656 100644
--- a/Src/Newtonsoft.Json.Tests/Schema/JsonSchemaGeneratorTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Schema/JsonSchemaGeneratorTests.cs
@@ -312,7 +312,7 @@ public void GenerateSchemaForType()
Assert.IsTrue(v.IsValid(schema));
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void GenerateSchemaForISerializable()
{
@@ -340,7 +340,7 @@ public void GenerateSchemaForDBNull()
}
#endif
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class CustomDirectoryInfoMapper : DefaultContractResolver
{
public CustomDirectoryInfoMapper()
@@ -376,17 +376,17 @@ public void GenerateSchemaCamelCase()
generator.UndefinedSchemaIdHandling = UndefinedSchemaIdHandling.UseTypeName;
generator.ContractResolver = new CamelCasePropertyNamesContractResolver()
{
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
IgnoreSerializableAttribute = true
#endif
};
- JsonSchema schema = generator.Generate(typeof(Version), true);
+ JsonSchema schema = generator.Generate(typeof(VersionOld), true);
string json = schema.ToString();
StringAssert.AreEqual(@"{
- ""id"": ""System.Version"",
+ ""id"": ""Newtonsoft.Json.Tests.TestObjects.VersionOld"",
""type"": [
""object"",
""null""
@@ -421,7 +421,7 @@ public void GenerateSchemaCamelCase()
}", json);
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void GenerateSchemaSerializable()
{
@@ -734,7 +734,7 @@ public class BulkInsertTask_DSL
{
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Serializable]
public sealed class SerializableTestObject
{
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/CamelCasePropertyNamesContractResolverTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/CamelCasePropertyNamesContractResolverTests.cs
index a96adcb0d..7346ef077 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/CamelCasePropertyNamesContractResolverTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/CamelCasePropertyNamesContractResolverTests.cs
@@ -119,7 +119,7 @@ public void JTokenWriter()
string json = o.ToString();
}
-#if !(PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
#pragma warning disable 618
[Test]
public void MemberSearchFlags()
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs
index ab680666f..7e4710e86 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs
@@ -24,6 +24,7 @@
#endregion
using System;
+using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
@@ -117,7 +118,7 @@ public class AddressWithDataMember
[TestFixture]
public class ContractResolverTests : TestFixtureBase
{
-#if !(PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void ResolveSerializableContract()
{
@@ -584,7 +585,7 @@ public void SingleTypeWithMultipleContractResolvers()
}", startingWithB);
}
-#if !(PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
#pragma warning disable 618
[Test]
public void SerializeCompilerGeneratedMembers()
@@ -727,6 +728,17 @@ protected virtual bool OnProp4Specified()
}
}
+ [Test]
+ public void NonGenericDictionary_KeyValueTypes()
+ {
+ DefaultContractResolver resolver = new DefaultContractResolver();
+
+ JsonDictionaryContract c = (JsonDictionaryContract)resolver.ResolveContract(typeof(IDictionary));
+
+ Assert.IsNull(c.DictionaryKeyType);
+ Assert.IsNull(c.DictionaryValueType);
+ }
+
[Test]
public void DefaultContractResolverIgnoreIsSpecifiedTrue()
{
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/DateOnlyTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/DateOnlyTests.cs
new file mode 100644
index 000000000..5d84052e0
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Serialization/DateOnlyTests.cs
@@ -0,0 +1,203 @@
+#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
+
+#if NET6_0_OR_GREATER
+using System;
+using System.Collections.Generic;
+#if !NET20
+using System.Xml.Linq;
+#endif
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+using Xunit.Abstractions;
+#else
+using NUnit.Framework;
+#endif
+
+namespace Newtonsoft.Json.Tests.Serialization
+{
+ [TestFixture]
+ public class DateOnlyTests : TestFixtureBase
+ {
+ [Test]
+ public void Serialize()
+ {
+ DateOnly d = new DateOnly(2000, 12, 29);
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"""2000-12-29""", json);
+ }
+
+ [Test]
+ public void SerializeDefault()
+ {
+ DateOnly d = default;
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"""0001-01-01""", json);
+ }
+
+ [Test]
+ public void SerializeMaxValue()
+ {
+ DateOnly d = DateOnly.MaxValue;
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"""9999-12-31""", json);
+ }
+
+ [Test]
+ public void SerializeMinValue()
+ {
+ DateOnly d = DateOnly.MinValue;
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"""0001-01-01""", json);
+ }
+
+ [Test]
+ public void SerializeNullable_Null()
+ {
+ DateOnly? d = default;
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual("null", json);
+ }
+
+ [Test]
+ public void SerializeNullable_Value()
+ {
+ DateOnly? d = new DateOnly(2000, 12, 29);
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"""2000-12-29""", json);
+ }
+
+ [Test]
+ public void SerializeList()
+ {
+ IList d = new List
+ {
+ new DateOnly(2000, 12, 29)
+ };
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"[
+ ""2000-12-29""
+]", json);
+ }
+
+ [Test]
+ public void SerializeList_Nullable()
+ {
+ IList d = new List
+ {
+ new DateOnly(2000, 12, 29),
+ null
+ };
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"[
+ ""2000-12-29"",
+ null
+]", json);
+ }
+
+ [Test]
+ public void Deserialize()
+ {
+ DateOnly d = JsonConvert.DeserializeObject(@"""2000-12-29""");
+
+ Assert.AreEqual(new DateOnly(2000, 12, 29), d);
+ }
+
+ [Test]
+ public void DeserializeDefault()
+ {
+ DateOnly d = JsonConvert.DeserializeObject(@"""0001-01-01""");
+
+ Assert.AreEqual(default(DateOnly), d);
+ }
+
+ [Test]
+ public void DeserializeMaxValue()
+ {
+ DateOnly d = JsonConvert.DeserializeObject(@"""9999-12-31""");
+
+ Assert.AreEqual(DateOnly.MaxValue, d);
+ }
+
+ [Test]
+ public void DeserializeMinValue()
+ {
+ DateOnly d = JsonConvert.DeserializeObject(@"""0001-01-01""");
+
+ Assert.AreEqual(DateOnly.MinValue, d);
+ }
+
+ [Test]
+ public void DeserializeNullable_Null()
+ {
+ DateOnly? d = JsonConvert.DeserializeObject(@"null");
+
+ Assert.AreEqual(null, d);
+ }
+
+ [Test]
+ public void DeserializeNullable_Value()
+ {
+ DateOnly? d = JsonConvert.DeserializeObject(@"""2000-12-29""");
+
+ Assert.AreEqual(new DateOnly(2000, 12, 29), d);
+ }
+
+ [Test]
+ public void DeserializeList()
+ {
+ var l = JsonConvert.DeserializeObject>(@"[
+ ""2000-12-29""
+]");
+
+ Assert.AreEqual(1, l.Count);
+ Assert.AreEqual(new DateOnly(2000, 12, 29), l[0]);
+ }
+
+ [Test]
+ public void DeserializeList_Nullable()
+ {
+ var l = JsonConvert.DeserializeObject>(@"[
+ ""2000-12-29"",
+ null
+]");
+
+ Assert.AreEqual(2, l.Count);
+ Assert.AreEqual(new DateOnly(2000, 12, 29), l[0]);
+ Assert.AreEqual(null, l[1]);
+ }
+ }
+}
+#endif
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/DependencyInjectionTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/DependencyInjectionTests.cs
index 959a9975a..dad1bb804 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/DependencyInjectionTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/DependencyInjectionTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET40 || NET35 || NET20 || DNXCORE50 || PORTABLE || PORTABLE40) || NETSTANDARD1_0 || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET40 || NET35 || NET20 || DNXCORE50 || PORTABLE || PORTABLE40) || NETSTANDARD1_0 || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using Autofac;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Tests.TestObjects;
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/DynamicTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/DynamicTests.cs
index 37cfb3672..b84585403 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/DynamicTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/DynamicTests.cs
@@ -101,7 +101,7 @@ public void SerializeDynamicObject()
Assert.AreEqual(dynamicObject.ChildObject.Text, d.ChildObject.Text);
}
-#if !(PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeDynamicObjectWithObjectTracking()
{
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/FSharpTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/FSharpTests.cs
index 10192bd72..e399ecd5f 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/FSharpTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/FSharpTests.cs
@@ -23,7 +23,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
-#if !(NET40 || NET35 || NET20 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET40 || NET35 || NET20 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
#if DNXCORE50
using Xunit;
using Test = Xunit.FactAttribute;
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ImmutableCollectionsTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ImmutableCollectionsTests.cs
index 81876c5de..09d8c4612 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/ImmutableCollectionsTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/ImmutableCollectionsTests.cs
@@ -304,6 +304,8 @@ public void DeserializeHashSetInterface()
Assert.IsTrue(l.Contains("3"));
Assert.IsTrue(l.Contains("II"));
Assert.IsTrue(l.Contains("One"));
+
+ Assert.IsTrue(l is ImmutableHashSet);
}
#endregion
@@ -395,6 +397,8 @@ public void DeserializeDictionaryInterface()
Assert.AreEqual("One", l[1]);
Assert.AreEqual("II", l[2]);
Assert.AreEqual("3", l[3]);
+
+ Assert.IsTrue(l is ImmutableDictionary);
}
#endregion
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerCollectionsTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerCollectionsTests.cs
index a7b64590c..56991bc68 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerCollectionsTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerCollectionsTests.cs
@@ -61,7 +61,30 @@ namespace Newtonsoft.Json.Tests.Serialization
[TestFixture]
public class JsonSerializerCollectionsTests : TestFixtureBase
{
-#if !(NET35 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(NET35 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
+ [Test]
+ public void DeserializeNonGenericListTypeAndReadOnlyListViaConstructor()
+ {
+ ConstructorCollectionContainer a = JsonConvert.DeserializeObject("{'a':1,'b':['aaa'],'c':['aaa']}");
+
+ Assert.AreEqual(1, a.A);
+ Assert.AreEqual(1, a.B.Count());
+ Assert.AreEqual("aaa", a.B.ElementAt(0));
+ Assert.AreEqual(0, a.C.Count());
+ }
+
+ public class ConstructorCollectionContainer
+ {
+ public int A { get; }
+ public IEnumerable B { get; } = new SortedSet();
+ public IEnumerable C { get; } = new List().AsReadOnly();
+
+ public ConstructorCollectionContainer(int a)
+ {
+ this.A = a;
+ }
+ }
+
[Test]
public void DeserializeConcurrentDictionaryWithNullValue()
{
@@ -164,7 +187,11 @@ public void FloatKey_MaxValue()
{
Dictionary dictionary = new Dictionary { { float.MaxValue, 1 } };
string output = JsonConvert.SerializeObject(dictionary);
+#if !(NETSTANDARD2_0 || NETSTANDARD1_3 || NET6_0_OR_GREATER)
Assert.AreEqual(@"{""3.40282347E+38"":1}", output);
+#else
+ Assert.AreEqual(@"{""3.4028235E+38"":1}", output);
+#endif
Dictionary deserializedValue = JsonConvert.DeserializeObject>(output);
Assert.AreEqual(float.MaxValue, deserializedValue.First().Key);
@@ -276,7 +303,7 @@ public void CollectionJsonConstructorBadIEnumerableParameter()
"Constructor for 'Newtonsoft.Json.Tests.Serialization.JsonSerializerCollectionsTests+TestCollectionBadIEnumerableParameter' must have no parameters or a single parameter that implements 'System.Collections.Generic.IEnumerable`1[System.Int32]'.");
}
-#if !(DNXCORE50 || PORTABLE) || NETSTANDARD2_0
+#if !(DNXCORE50 || PORTABLE) || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class TestCollectionNonGeneric : ArrayList
{
[JsonConstructor]
@@ -389,7 +416,7 @@ public void DictionaryJsonConstructorBadIEnumerableParameter()
"Constructor for 'Newtonsoft.Json.Tests.Serialization.JsonSerializerCollectionsTests+TestDictionaryBadIEnumerableParameter' must have no parameters or a single parameter that implements 'System.Collections.Generic.IEnumerable`1[System.Collections.Generic.KeyValuePair`2[System.String,System.Int32]]'.");
}
-#if !(DNXCORE50 || PORTABLE) || NETSTANDARD2_0
+#if !(DNXCORE50 || PORTABLE) || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class TestDictionaryNonGeneric : Hashtable
{
[JsonConstructor]
@@ -412,7 +439,7 @@ public void DictionaryJsonConstructorNonGeneric()
}
#endif
-#if !(DNXCORE50) || NETSTANDARD2_0
+#if !(DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class NameValueCollectionTestClass
{
public NameValueCollection Collection { get; set; }
@@ -427,7 +454,7 @@ public void DeserializeNameValueCollection()
}
#endif
-#if !(NET35 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(NET35 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class SomeObject
{
public string Text1 { get; set; }
@@ -1069,7 +1096,7 @@ public void NullableValueGenericDictionary()
Assert.AreEqual(3, v2["Third"]);
}
-#if !(NET35 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD2_0
+#if !(NET35 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeConcurrentDictionary()
{
@@ -1783,7 +1810,7 @@ public void ComplexValuesInObjectArray()
Assert.AreEqual(1, (int)((JObject)o.Data[2])["one"]);
}
-#if !(DNXCORE50) || NETSTANDARD2_0
+#if !(DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeArrayAsArrayList()
{
@@ -2048,7 +2075,7 @@ public void ReadOnlyIntegerList()
}
#endif
-#if !DNXCORE50 || NETSTANDARD2_0
+#if !DNXCORE50 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void EmptyStringInHashtableIsDeserialized()
{
@@ -2108,6 +2135,26 @@ public void DeserializeCultureInfoKey()
}
#endif
+ [Test]
+ public void DeserializeEmptyEnumerable_NoItems()
+ {
+ ValuesClass c = JsonConvert.DeserializeObject(@"{""Values"":[]}");
+ Assert.AreEqual(0, c.Values.Count());
+ }
+
+ [Test]
+ public void DeserializeEmptyEnumerable_HasItems()
+ {
+ ValuesClass c = JsonConvert.DeserializeObject(@"{""Values"":[""hello""]}");
+ Assert.AreEqual(1, c.Values.Count());
+ Assert.AreEqual("hello", c.Values.ElementAt(0));
+ }
+
+ public class ValuesClass
+ {
+ public IEnumerable Values { get; set; } = Enumerable.Empty();
+ }
+
[Test]
public void DeserializeConstructorWithReadonlyArrayProperty()
{
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs
index 80d77bc5a..35e885258 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs
@@ -29,10 +29,10 @@
using System.Collections.Concurrent;
#endif
using System.Collections.Generic;
-#if !(NET20 || NET35 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Numerics;
#endif
-#if !(NET20 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET20 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.ComponentModel.DataAnnotations;
using System.Configuration;
using System.Runtime.CompilerServices;
@@ -48,6 +48,7 @@
using Xunit;
using Test = Xunit.FactAttribute;
using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+using TestCase = Xunit.InlineDataAttribute;
#else
using NUnit.Framework;
#endif
@@ -220,7 +221,7 @@ public void DeserializeGenericIEnumerableWithImplicitConversion()
Assert.AreEqual("def", enumerableObject[1].Value);
}
-#if !(PORTABLE || PORTABLE40 || NET20 || NET35) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || NET20 || NET35) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void LargeIntegerAsString()
{
@@ -276,7 +277,7 @@ public void DeserializeBoolean_EmptyString()
@"Error converting value {null} to type 'System.Boolean'. Path '[0]', line 1, position 3.");
}
-#if !(PORTABLE || PORTABLE40 || NET35 || NET20) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || NET35 || NET20) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeBooleans()
{
@@ -741,7 +742,7 @@ public void DeserializeNullToJTokenProperty()
Assert.IsNull(otc.Value5);
}
-#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void ReadIntegerWithError()
{
@@ -998,7 +999,7 @@ public void JsonSerializerProperties()
serializer.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, serializer.ConstructorHandling);
-#if !(DNXCORE50) || NETSTANDARD2_0
+#if !(DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
serializer.Context = new StreamingContext(StreamingContextStates.Other);
Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), serializer.Context);
#endif
@@ -1069,7 +1070,7 @@ public void JsonSerializerProperties()
serializer.TraceWriter = traceWriter;
Assert.AreEqual(traceWriter, serializer.TraceWriter);
-#if !(PORTABLE || PORTABLE40 || NET20 || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || NET20 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
#pragma warning disable 618
serializer.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
Assert.AreEqual(FormatterAssemblyStyle.Full, serializer.TypeNameAssemblyFormat);
@@ -1112,7 +1113,7 @@ public void JsonSerializerSettingsProperties()
settings.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, settings.ConstructorHandling);
-#if !(DNXCORE50) || NETSTANDARD2_0
+#if !(DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
settings.Context = new StreamingContext(StreamingContextStates.Other);
Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), settings.Context);
#endif
@@ -1189,7 +1190,7 @@ public void JsonSerializerSettingsProperties()
settings.TraceWriter = traceWriter;
Assert.AreEqual(traceWriter, settings.TraceWriter);
-#if !(PORTABLE || PORTABLE40 || NET20 || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || NET20 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
#pragma warning disable 618
settings.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
Assert.AreEqual(FormatterAssemblyStyle.Full, settings.TypeNameAssemblyFormat);
@@ -1243,7 +1244,7 @@ public void JsonSerializerProxyProperties()
serializerProxy.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, serializerProxy.ConstructorHandling);
-#if !(DNXCORE50) || NETSTANDARD2_0
+#if !(DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
serializerProxy.Context = new StreamingContext(StreamingContextStates.Other);
Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), serializerProxy.Context);
#endif
@@ -1314,7 +1315,7 @@ public void JsonSerializerProxyProperties()
serializerProxy.TraceWriter = traceWriter;
Assert.AreEqual(traceWriter, serializerProxy.TraceWriter);
-#if !(PORTABLE || PORTABLE40 || NET20 || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || NET20 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
#pragma warning disable 618
serializerProxy.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
Assert.AreEqual(FormatterAssemblyStyle.Full, serializerProxy.TypeNameAssemblyFormat);
@@ -1335,7 +1336,7 @@ public void JsonSerializerProxyProperties()
Assert.AreEqual(TypeNameHandling.All, serializerProxy.TypeNameHandling);
}
-#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeISerializableIConvertible()
{
@@ -1817,7 +1818,7 @@ public void TestMethodExecutorObject()
Assert.AreEqual(executorObject2.clientGetResultFunction, "ClientBanSubsCB");
}
-#if !(DNXCORE50) || NETSTANDARD2_0
+#if !(DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void HashtableDeserialization()
{
@@ -2258,7 +2259,40 @@ public void SerializeConverableObjects()
string json = JsonConvert.SerializeObject(new ConverableMembers(), Formatting.Indented);
string expected = null;
-#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0
+#if (NETSTANDARD2_0 || NET6_0_OR_GREATER)
+ expected = @"{
+ ""String"": ""string"",
+ ""Int32"": 2147483647,
+ ""UInt32"": 4294967295,
+ ""Byte"": 255,
+ ""SByte"": 127,
+ ""Short"": 32767,
+ ""UShort"": 65535,
+ ""Long"": 9223372036854775807,
+ ""ULong"": 9223372036854775807,
+ ""Double"": 1.7976931348623157E+308,
+ ""Float"": 3.4028235E+38,
+ ""DBNull"": null,
+ ""Bool"": true,
+ ""Char"": ""\u0000""
+}";
+#elif NETSTANDARD1_3
+ expected = @"{
+ ""String"": ""string"",
+ ""Int32"": 2147483647,
+ ""UInt32"": 4294967295,
+ ""Byte"": 255,
+ ""SByte"": 127,
+ ""Short"": 32767,
+ ""UShort"": 65535,
+ ""Long"": 9223372036854775807,
+ ""ULong"": 9223372036854775807,
+ ""Double"": 1.7976931348623157E+308,
+ ""Float"": 3.4028235E+38,
+ ""Bool"": true,
+ ""Char"": ""\u0000""
+}";
+#elif !(PORTABLE || DNXCORE50) || NETSTANDARD1_3
expected = @"{
""String"": ""string"",
""Int32"": 2147483647,
@@ -2276,7 +2310,7 @@ public void SerializeConverableObjects()
""Char"": ""\u0000""
}";
#else
- expected = @"{
+ expected = @"{
""String"": ""string"",
""Int32"": 2147483647,
""UInt32"": 4294967295,
@@ -3441,7 +3475,7 @@ To fix this error either change the JSON to a JSON object (e.g. {""name"":""valu
Path '', line 1, position 1.");
}
-#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void CannotDeserializeArrayIntoSerializable()
{
@@ -3482,13 +3516,9 @@ public void CannotDeserializeArrayIntoLinqToJson()
{
string json = @"[]";
- ExceptionAssert.Throws(
+ ExceptionAssert.Throws(
() => { JsonConvert.DeserializeObject(json); },
- new[]
- {
- "Unable to cast object of type 'Newtonsoft.Json.Linq.JArray' to type 'Newtonsoft.Json.Linq.JObject'.",
- "Cannot cast from source type to destination type." // mono
- });
+ "Deserialized JSON type 'Newtonsoft.Json.Linq.JArray' is not compatible with expected type 'Newtonsoft.Json.Linq.JObject'. Path '', line 1, position 2.");
}
[Test]
@@ -3559,7 +3589,7 @@ public void SerializePropertyGetError()
{
ContractResolver = new DefaultContractResolver
{
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
IgnoreSerializableAttribute = true
#endif
}
@@ -3576,7 +3606,7 @@ public void DeserializePropertySetError()
{
ContractResolver = new DefaultContractResolver
{
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
IgnoreSerializableAttribute = true
#endif
}
@@ -3593,7 +3623,7 @@ public void DeserializeEnsureTypeEmptyStringToIntError()
{
ContractResolver = new DefaultContractResolver
{
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
IgnoreSerializableAttribute = true
#endif
}
@@ -3610,7 +3640,7 @@ public void DeserializeEnsureTypeNullToIntError()
{
ContractResolver = new DefaultContractResolver
{
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
IgnoreSerializableAttribute = true
#endif
}
@@ -4072,7 +4102,7 @@ public void SerializeNonIDictionary()
Assert.AreEqual("value", newModelStateDictionary["key"]);
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
#if DEBUG
[Test]
public void SerializeISerializableInPartialTrustWithIgnoreInterface()
@@ -4309,7 +4339,7 @@ public void SerializeClassWithInheritedProtectedMember()
}", json);
}
-#if !(PORTABLE) || NETSTANDARD2_0
+#if !(PORTABLE) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeClassWithInheritedProtectedMember()
{
@@ -4409,7 +4439,7 @@ public void SerializeDeserializeXNodeProperties()
}
#endif
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeDeserializeXmlNodeProperties()
{
@@ -4513,7 +4543,22 @@ public void DeserializeIgnoredPropertyInConstructor()
{
string json = @"{""First"":""First"",""Second"":2,""Ignored"":{""Name"":""James""},""AdditionalContent"":{""LOL"":true}}";
- ConstructorCompexIgnoredProperty cc = JsonConvert.DeserializeObject(json);
+ var cc = JsonConvert.DeserializeObject(json);
+ Assert.AreEqual("First", cc.First);
+ Assert.AreEqual(2, cc.Second);
+ Assert.AreEqual(null, cc.Ignored);
+ }
+
+ [Test]
+ public void DeserializeIgnoredPropertyInConstructorWithoutThrowingMissingMemberError()
+ {
+ string json = @"{""First"":""First"",""Second"":2,""Ignored"":{""Name"":""James""}}";
+
+ var cc = JsonConvert.DeserializeObject(
+ json, new JsonSerializerSettings
+ {
+ MissingMemberHandling = MissingMemberHandling.Error
+ });
Assert.AreEqual("First", cc.First);
Assert.AreEqual(2, cc.Second);
Assert.AreEqual(null, cc.Ignored);
@@ -4625,7 +4670,7 @@ public void DeserializeByteArray()
Assert.AreEqual(0, z[1].Prop1.Length);
}
-#if !(NET20 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET20 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void StringDictionaryTest()
{
@@ -4870,7 +4915,7 @@ public void PrivateSetterOnBaseClassProperty()
Assert.AreEqual(meh.IDontWork, "meh");
}
-#if !(NET20 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET20 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeNullableStruct()
{
@@ -5301,7 +5346,7 @@ public void DeserializeStringIntoNullableGuid()
Assert.AreEqual(new Guid("bb2f3da7-bf79-4d14-9d54-0a1f7ff5f902"), c.clientId);
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeException1()
{
@@ -5520,7 +5565,7 @@ public void SerializeStaticReflection()
Assert.AreEqual(-3, StaticTestClass.z);
}
-#if !(NET20 || DNXCORE50) || NETSTANDARD2_0
+#if !(NET20 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeDecimalsWithCulture()
{
@@ -5620,7 +5665,7 @@ public void DeserializeNullInt()
}, "Error converting value {null} to type 'System.Int32'. Path '[3]', line 5, position 6.");
}
-#if !(PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeIConvertible()
{
@@ -5884,7 +5929,8 @@ public void DeserializeDoubleFromNullString()
new[]
{
"Value cannot be null." + Environment.NewLine + "Parameter name: value",
- "Argument cannot be null." + Environment.NewLine + "Parameter name: value" // mono
+ "Argument cannot be null." + Environment.NewLine + "Parameter name: value", // mono
+ "Value cannot be null. (Parameter 'value')"
});
}
@@ -5896,7 +5942,8 @@ public void DeserializeFromNullString()
new[]
{
"Value cannot be null." + Environment.NewLine + "Parameter name: value",
- "Argument cannot be null." + Environment.NewLine + "Parameter name: value" // mono
+ "Argument cannot be null." + Environment.NewLine + "Parameter name: value", // mono
+ "Value cannot be null. (Parameter 'value')"
});
}
@@ -6292,8 +6339,8 @@ public void DateTimeDictionaryKey_DateTime_Iso_Local()
{
IDictionary dic1 = new Dictionary
{
- { new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc), 1 },
- { new DateTime(2013, 12, 12, 12, 12, 12, DateTimeKind.Utc), 2 }
+ { new DateTime(2020, 12, 12, 12, 12, 12, DateTimeKind.Utc), 1 },
+ { new DateTime(2023, 12, 12, 12, 12, 12, DateTimeKind.Utc), 2 }
};
string json = JsonConvert.SerializeObject(dic1, Formatting.Indented, new JsonSerializerSettings
@@ -6311,8 +6358,8 @@ public void DateTimeDictionaryKey_DateTime_Iso_Local()
});
Assert.AreEqual(2, dic2.Count);
- Assert.AreEqual(1, dic2[new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc)]);
- Assert.AreEqual(2, dic2[new DateTime(2013, 12, 12, 12, 12, 12, DateTimeKind.Utc)]);
+ Assert.AreEqual(1, dic2[new DateTime(2020, 12, 12, 12, 12, 12, DateTimeKind.Utc)]);
+ Assert.AreEqual(2, dic2[new DateTime(2023, 12, 12, 12, 12, 12, DateTimeKind.Utc)]);
}
[Test]
@@ -6348,7 +6395,7 @@ public void DeserializeEmptyJsonString()
Assert.AreEqual("", s);
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeAndDeserializeWithAttributes()
{
@@ -6718,7 +6765,7 @@ public void SerializeFloatingPointHandling()
}
#if !(NET20 || NET35 || NET40 || PORTABLE40)
-#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeReadOnlyListWithBigInteger()
{
@@ -6776,7 +6823,7 @@ public void SerializeCustomTupleWithSerializableAttribute()
Action doStuff = () => { obj = JsonConvert.DeserializeObject>(json); };
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
doStuff();
Assert.AreEqual(500, obj.Item1);
#else
@@ -6807,7 +6854,7 @@ public void SerializeCustomTupleWithSerializableAttributeInPartialTrust()
}
#endif
-#if !(PORTABLE || NET35 || NET20 || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || NET35 || NET20 || PORTABLE40 || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeTupleWithSerializableAttribute()
{
@@ -7003,7 +7050,7 @@ public void NoConstructorReadOnlyDictionaryTest()
}
#endif
-#if !(PORTABLE || NET35 || NET20 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || NET35 || NET20 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void ReadTooLargeInteger()
{
@@ -7026,7 +7073,7 @@ public void SerializeStructWithSerializableAndDataContract()
Assert.AreEqual(@"{""First"":""One"",""Second"":2}", json);
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
DefaultContractResolver r = new DefaultContractResolver();
r.IgnoreSerializableAttribute = false;
@@ -7133,7 +7180,7 @@ public void DeserializeDecimal()
Assert.AreEqual(1234567890.123456m, d);
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DontSerializeStaticFields()
{
@@ -7157,7 +7204,7 @@ public void DontSerializeStaticFields()
}
#endif
-#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeBigInteger()
{
@@ -7298,7 +7345,7 @@ public void SerializeDictionaryWithStructKey()
}
#endif
-#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD1_0 || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD1_0 || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void SerializeDictionaryWithStructKey_Custom()
{
@@ -7389,7 +7436,7 @@ public void DeserializeCustomReferenceResolver_ViaProvider()
Assert.AreEqual(jane, john.Spouse);
}
-#if !(NET35 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET35 || NET20 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void TypeConverterOnInterface()
{
@@ -7455,7 +7502,7 @@ public void Main()
ParticipantEntity deserializedProduct = JsonConvert.DeserializeObject(json);
}
-#if !(PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void ConvertibleIdTest()
{
@@ -7781,7 +7828,7 @@ public void DeserializedDerivedWithPrivate()
Assert.AreEqual("derived", d.DerivedProperty);
}
-#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeNullableUnsignedLong()
{
@@ -7796,7 +7843,7 @@ public void DeserializeNullableUnsignedLong()
}
#endif
-#if !(DNXCORE50) || NETSTANDARD2_0
+#if !(DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void MailMessageConverterTest()
{
@@ -7945,5 +7992,226 @@ public void NullableDoubleEmptyValue()
() => JsonConvert.DeserializeObject("{ A: \"\", B: 1, C: 123, D: 1.23, E: , F: null }"),
"Unexpected character encountered while parsing value: ,. Path 'E', line 1, position 36.");
}
+
+ [Test]
+ public void SetMaxDepth_DepthExceeded()
+ {
+ JsonTextReader reader = new JsonTextReader(new StringReader("[[['text']]]"));
+ Assert.AreEqual(64, reader.MaxDepth);
+
+ JsonSerializerSettings settings = new JsonSerializerSettings();
+ Assert.AreEqual(64, settings.MaxDepth);
+ Assert.AreEqual(false, settings._maxDepthSet);
+
+ // Default should be the same
+ Assert.AreEqual(reader.MaxDepth, settings.MaxDepth);
+
+ settings.MaxDepth = 2;
+ Assert.AreEqual(2, settings.MaxDepth);
+ Assert.AreEqual(true, settings._maxDepthSet);
+
+ JsonSerializer serializer = JsonSerializer.Create(settings);
+ Assert.AreEqual(2, serializer.MaxDepth);
+
+ ExceptionAssert.Throws(
+ () => serializer.Deserialize(reader),
+ "The reader's MaxDepth of 2 has been exceeded. Path '[0][0]', line 1, position 3.");
+ }
+
+ [Test]
+ public void SetMaxDepth_DepthNotExceeded()
+ {
+ JsonTextReader reader = new JsonTextReader(new StringReader("['text']"));
+ JsonSerializerSettings settings = new JsonSerializerSettings();
+
+ settings.MaxDepth = 2;
+
+ JsonSerializer serializer = JsonSerializer.Create(settings);
+ Assert.AreEqual(2, serializer.MaxDepth);
+
+ serializer.Deserialize(reader);
+
+ Assert.AreEqual(64, reader.MaxDepth);
+ }
+
+ [Test]
+ public void SetMaxDepth_DefaultDepthExceeded()
+ {
+ string json = GetNestedJson(150);
+
+ ExceptionAssert.Throws(
+ () => JsonConvert.DeserializeObject(json),
+ "The reader's MaxDepth of 64 has been exceeded. Path '0.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63', line 65, position 135.");
+ }
+
+ [Test]
+ public void SetMaxDepth_IncreasedDepthNotExceeded()
+ {
+ string json = GetNestedJson(150);
+
+ JObject o = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { MaxDepth = 150 });
+ int depth = GetDepth(o);
+
+ Assert.AreEqual(150, depth);
+ }
+
+ [Test]
+ public void SetMaxDepth_NullDepthNotExceeded()
+ {
+ string json = GetNestedJson(150);
+
+ JObject o = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { MaxDepth = null });
+ int depth = GetDepth(o);
+
+ Assert.AreEqual(150, depth);
+ }
+
+ [Test]
+ public void SetMaxDepth_MaxValueDepthNotExceeded()
+ {
+ string json = GetNestedJson(150);
+
+ JObject o = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { MaxDepth = int.MaxValue });
+ int depth = GetDepth(o);
+
+ Assert.AreEqual(150, depth);
+ }
+
+#if DNXCORE50
+ [Theory]
+#endif
+ [TestCase(true)]
+ [TestCase(false)]
+ public void ShallowCopy_CopyAllProperties(bool specifyDateFormatString)
+ {
+ var propertyNames = typeof(JsonSerializerSettings).GetProperties().Select(property => property.Name).ToList();
+
+ var settings = new JsonSerializerSettings();
+ if (specifyDateFormatString)
+ {
+ settings.DateFormatString = "yyyy";
+ }
+
+ var clone = new JsonSerializerSettings(settings);
+
+ Assert.AreEqual(settings.DateFormatString, clone.DateFormatString);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DateFormatString)));
+
+ Assert.AreEqual(settings.DateFormatHandling, clone.DateFormatHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DateFormatHandling)));
+
+ Assert.AreEqual(settings.ReferenceLoopHandling, clone.ReferenceLoopHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ReferenceLoopHandling)));
+
+ Assert.AreEqual(settings.MissingMemberHandling, clone.MissingMemberHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.MissingMemberHandling)));
+
+ Assert.AreEqual(settings.ObjectCreationHandling, clone.ObjectCreationHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ObjectCreationHandling)));
+
+ Assert.AreEqual(settings.NullValueHandling, clone.NullValueHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.NullValueHandling)));
+
+ Assert.AreEqual(settings.DefaultValueHandling, clone.DefaultValueHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DefaultValueHandling)));
+
+ Assert.AreEqual(settings.Converters, clone.Converters);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Converters)));
+
+ Assert.AreEqual(settings.PreserveReferencesHandling, clone.PreserveReferencesHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.PreserveReferencesHandling)));
+
+ Assert.AreEqual(settings.TypeNameHandling, clone.TypeNameHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.TypeNameHandling)));
+
+ Assert.AreEqual(settings.MetadataPropertyHandling, clone.MetadataPropertyHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.MetadataPropertyHandling)));
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ Assert.AreEqual(settings.TypeNameAssemblyFormat, clone.TypeNameAssemblyFormat);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.TypeNameAssemblyFormat)));
+#pragma warning restore CS0618 // Type or member is obsolete
+
+ Assert.AreEqual(settings.TypeNameAssemblyFormatHandling, clone.TypeNameAssemblyFormatHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.TypeNameAssemblyFormatHandling)));
+
+ Assert.AreEqual(settings.ConstructorHandling, clone.ConstructorHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ConstructorHandling)));
+
+ Assert.AreEqual(settings.ContractResolver, clone.ContractResolver);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ContractResolver)));
+
+ Assert.AreEqual(settings.EqualityComparer, clone.EqualityComparer);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.EqualityComparer)));
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ Assert.AreEqual(settings.ReferenceResolver, clone.ReferenceResolver);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ReferenceResolver)));
+#pragma warning restore CS0618 // Type or member is obsolete
+
+ Assert.AreEqual(settings.ReferenceResolverProvider, clone.ReferenceResolverProvider);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ReferenceResolverProvider)));
+
+ Assert.AreEqual(settings.TraceWriter, clone.TraceWriter);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.TraceWriter)));
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ Assert.AreEqual(settings.Binder, clone.Binder);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Binder)));
+#pragma warning restore CS0618 // Type or member is obsolete
+
+ Assert.AreEqual(settings.SerializationBinder, clone.SerializationBinder);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.SerializationBinder)));
+
+ Assert.AreEqual(settings.Error, clone.Error);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Error)));
+
+ Assert.AreEqual(settings.Context, clone.Context);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Context)));
+
+ Assert.AreEqual(settings.MaxDepth, clone.MaxDepth);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.MaxDepth)));
+
+ Assert.AreEqual(settings.Formatting, clone.Formatting);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Formatting)));
+
+ Assert.AreEqual(settings.DateTimeZoneHandling, clone.DateTimeZoneHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DateTimeZoneHandling)));
+
+ Assert.AreEqual(settings.DateParseHandling, clone.DateParseHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DateParseHandling)));
+
+ Assert.AreEqual(settings.FloatFormatHandling, clone.FloatFormatHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.FloatFormatHandling)));
+
+ Assert.AreEqual(settings.FloatParseHandling, clone.FloatParseHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.FloatParseHandling)));
+
+ Assert.AreEqual(settings.StringEscapeHandling, clone.StringEscapeHandling);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.StringEscapeHandling)));
+
+ Assert.AreEqual(settings.Culture, clone.Culture);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Culture)));
+
+ Assert.AreEqual(settings.CheckAdditionalContent, clone.CheckAdditionalContent);
+ Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.CheckAdditionalContent)));
+
+ Assert.AreEqual(0, propertyNames.Count);
+ }
+
+ private static int GetDepth(JToken o)
+ {
+ int depth = 1;
+ while (o.First != null)
+ {
+ o = o.First;
+ if (o.Type == JTokenType.Object)
+ {
+ depth++;
+ }
+ }
+
+ return depth;
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/KebabCaseNamingStrategyTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/KebabCaseNamingStrategyTests.cs
new file mode 100644
index 000000000..5737607a7
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Serialization/KebabCaseNamingStrategyTests.cs
@@ -0,0 +1,324 @@
+#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 Newtonsoft.Json.Serialization;
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+#else
+using NUnit.Framework;
+#endif
+using Newtonsoft.Json.Tests.TestObjects;
+using Newtonsoft.Json.Tests.TestObjects.Organization;
+using Newtonsoft.Json.Linq;
+using System.Reflection;
+using Newtonsoft.Json.Utilities;
+
+namespace Newtonsoft.Json.Tests.Serialization
+{
+ [TestFixture]
+ public class KebabCaseNamingStrategyTests : TestFixtureBase
+ {
+ [Test]
+ public void JsonConvertSerializerSettings()
+ {
+ Person person = new Person();
+ person.BirthDate = new DateTime(2000, 11, 20, 23, 55, 44, DateTimeKind.Utc);
+ person.LastModified = new DateTime(2000, 11, 20, 23, 55, 44, DateTimeKind.Utc);
+ person.Name = "Name!";
+
+ DefaultContractResolver contractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = new KebabCaseNamingStrategy()
+ };
+
+ string json = JsonConvert.SerializeObject(person, Formatting.Indented, new JsonSerializerSettings
+ {
+ ContractResolver = contractResolver
+ });
+
+ StringAssert.AreEqual(@"{
+ ""name"": ""Name!"",
+ ""birth-date"": ""2000-11-20T23:55:44Z"",
+ ""last-modified"": ""2000-11-20T23:55:44Z""
+}", json);
+
+ Person deserializedPerson = JsonConvert.DeserializeObject(json, new JsonSerializerSettings
+ {
+ ContractResolver = contractResolver
+ });
+
+ Assert.AreEqual(person.BirthDate, deserializedPerson.BirthDate);
+ Assert.AreEqual(person.LastModified, deserializedPerson.LastModified);
+ Assert.AreEqual(person.Name, deserializedPerson.Name);
+
+ json = JsonConvert.SerializeObject(person, Formatting.Indented);
+ StringAssert.AreEqual(@"{
+ ""Name"": ""Name!"",
+ ""BirthDate"": ""2000-11-20T23:55:44Z"",
+ ""LastModified"": ""2000-11-20T23:55:44Z""
+}", json);
+ }
+
+ [Test]
+ public void JTokenWriter_OverrideSpecifiedName()
+ {
+ JsonIgnoreAttributeOnClassTestClass ignoreAttributeOnClassTestClass = new JsonIgnoreAttributeOnClassTestClass();
+ ignoreAttributeOnClassTestClass.Field = int.MinValue;
+
+ DefaultContractResolver contractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = new KebabCaseNamingStrategy
+ {
+ OverrideSpecifiedNames = true
+ }
+ };
+
+ JsonSerializer serializer = new JsonSerializer();
+ serializer.ContractResolver = contractResolver;
+
+ JTokenWriter writer = new JTokenWriter();
+
+ serializer.Serialize(writer, ignoreAttributeOnClassTestClass);
+
+ JObject o = (JObject)writer.Token;
+ JProperty p = o.Property("the-field");
+
+ Assert.IsNotNull(p);
+ Assert.AreEqual(int.MinValue, (int)p.Value);
+ }
+
+ [Test]
+ public void BlogPostExample()
+ {
+ Product product = new Product
+ {
+ ExpiryDate = new DateTime(2010, 12, 20, 18, 1, 0, DateTimeKind.Utc),
+ Name = "Widget",
+ Price = 9.99m,
+ Sizes = new[] { "Small", "Medium", "Large" }
+ };
+
+ DefaultContractResolver contractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = new KebabCaseNamingStrategy()
+ };
+
+ string json =
+ JsonConvert.SerializeObject(
+ product,
+ Formatting.Indented,
+ new JsonSerializerSettings { ContractResolver = contractResolver }
+ );
+
+ //{
+ // "name": "Widget",
+ // "expiryDate": "\/Date(1292868060000)\/",
+ // "price": 9.99,
+ // "sizes": [
+ // "Small",
+ // "Medium",
+ // "Large"
+ // ]
+ //}
+
+ StringAssert.AreEqual(@"{
+ ""name"": ""Widget"",
+ ""expiry-date"": ""2010-12-20T18:01:00Z"",
+ ""price"": 9.99,
+ ""sizes"": [
+ ""Small"",
+ ""Medium"",
+ ""Large""
+ ]
+}", json);
+ }
+
+#if !(NET35 || NET20 || PORTABLE40)
+ [Test]
+ public void DynamicKebabCasePropertyNames()
+ {
+ dynamic o = new TestDynamicObject();
+ o.Text = "Text!";
+ o.Integer = int.MaxValue;
+
+ DefaultContractResolver contractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = new KebabCaseNamingStrategy
+ {
+ ProcessDictionaryKeys = true
+ }
+ };
+
+ string json = JsonConvert.SerializeObject(o, Formatting.Indented,
+ new JsonSerializerSettings
+ {
+ ContractResolver = contractResolver
+ });
+
+ StringAssert.AreEqual(@"{
+ ""explicit"": false,
+ ""text"": ""Text!"",
+ ""integer"": 2147483647,
+ ""int"": 0,
+ ""child-object"": null
+}", json);
+ }
+#endif
+
+ [Test]
+ public void DictionaryKebabCasePropertyNames_Disabled()
+ {
+ Dictionary values = new Dictionary
+ {
+ { "First", "Value1!" },
+ { "Second", "Value2!" }
+ };
+
+ DefaultContractResolver contractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = new KebabCaseNamingStrategy()
+ };
+
+ string json = JsonConvert.SerializeObject(values, Formatting.Indented,
+ new JsonSerializerSettings
+ {
+ ContractResolver = contractResolver
+ });
+
+ StringAssert.AreEqual(@"{
+ ""First"": ""Value1!"",
+ ""Second"": ""Value2!""
+}", json);
+ }
+
+ [Test]
+ public void DictionaryKebabCasePropertyNames_Enabled()
+ {
+ Dictionary values = new Dictionary
+ {
+ { "First", "Value1!" },
+ { "Second", "Value2!" }
+ };
+
+ DefaultContractResolver contractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = new KebabCaseNamingStrategy
+ {
+ ProcessDictionaryKeys = true
+ }
+ };
+
+ string json = JsonConvert.SerializeObject(values, Formatting.Indented,
+ new JsonSerializerSettings
+ {
+ ContractResolver = contractResolver
+ });
+
+ StringAssert.AreEqual(@"{
+ ""first"": ""Value1!"",
+ ""second"": ""Value2!""
+}", json);
+ }
+
+ public class PropertyAttributeNamingStrategyTestClass
+ {
+ [JsonProperty]
+ public string HasNoAttributeNamingStrategy { get; set; }
+
+ [JsonProperty(NamingStrategyType = typeof(KebabCaseNamingStrategy))]
+ public string HasAttributeNamingStrategy { get; set; }
+ }
+
+ [Test]
+ public void JsonPropertyAttribute_NamingStrategyType()
+ {
+ PropertyAttributeNamingStrategyTestClass c = new PropertyAttributeNamingStrategyTestClass
+ {
+ HasNoAttributeNamingStrategy = "Value1!",
+ HasAttributeNamingStrategy = "Value2!"
+ };
+
+ string json = JsonConvert.SerializeObject(c, Formatting.Indented);
+
+ StringAssert.AreEqual(@"{
+ ""HasNoAttributeNamingStrategy"": ""Value1!"",
+ ""has-attribute-naming-strategy"": ""Value2!""
+}", json);
+ }
+
+ [JsonObject(NamingStrategyType = typeof(KebabCaseNamingStrategy))]
+ public class ContainerAttributeNamingStrategyTestClass
+ {
+ public string Prop1 { get; set; }
+ public string Prop2 { get; set; }
+ [JsonProperty(NamingStrategyType = typeof(DefaultNamingStrategy))]
+ public string HasAttributeNamingStrategy { get; set; }
+ }
+
+ [Test]
+ public void JsonObjectAttribute_NamingStrategyType()
+ {
+ ContainerAttributeNamingStrategyTestClass c = new ContainerAttributeNamingStrategyTestClass
+ {
+ Prop1 = "Value1!",
+ Prop2 = "Value2!"
+ };
+
+ string json = JsonConvert.SerializeObject(c, Formatting.Indented);
+
+ StringAssert.AreEqual(@"{
+ ""prop1"": ""Value1!"",
+ ""prop2"": ""Value2!"",
+ ""HasAttributeNamingStrategy"": null
+}", json);
+ }
+
+ [JsonDictionary(NamingStrategyType = typeof(KebabCaseNamingStrategy), NamingStrategyParameters = new object[] { true, true })]
+ public class DictionaryAttributeNamingStrategyTestClass : Dictionary
+ {
+ }
+
+ [Test]
+ public void JsonDictionaryAttribute_NamingStrategyType()
+ {
+ DictionaryAttributeNamingStrategyTestClass c = new DictionaryAttributeNamingStrategyTestClass
+ {
+ ["Key1"] = "Value1!",
+ ["Key2"] = "Value2!"
+ };
+
+ string json = JsonConvert.SerializeObject(c, Formatting.Indented);
+
+ StringAssert.AreEqual(@"{
+ ""key1"": ""Value1!"",
+ ""key2"": ""Value2!""
+}", json);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/MetadataPropertyHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/MetadataPropertyHandlingTests.cs
index ea60f8a8d..e7d00dfb1 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/MetadataPropertyHandlingTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/MetadataPropertyHandlingTests.cs
@@ -324,7 +324,7 @@ public void DeserializeFromJToken()
]";
JToken t1 = JToken.Parse(json);
- JToken t2 = t1.CloneToken();
+ JToken t2 = t1.DeepClone();
List employees = t1.ToObject>(JsonSerializer.Create(new JsonSerializerSettings
{
@@ -339,7 +339,7 @@ public void DeserializeFromJToken()
Assert.IsTrue(JToken.DeepEquals(t1, t2));
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DeserializeGenericObjectListWithTypeName()
{
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/NamingStrategyEquality.cs b/Src/Newtonsoft.Json.Tests/Serialization/NamingStrategyEquality.cs
index 3bb0af55d..591a2906e 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/NamingStrategyEquality.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/NamingStrategyEquality.cs
@@ -97,6 +97,25 @@ public void SnakeCaseNamingStrategyEqualityVariants()
CheckInequality(true, true, true);
}
+ [Test]
+ public void KebabCaseStrategyEquality()
+ {
+ var s1 = new KebabCaseNamingStrategy();
+ var s2 = new KebabCaseNamingStrategy();
+ Assert.IsTrue(s1.Equals(s2));
+ Assert.IsTrue(s1.GetHashCode() == s2.GetHashCode());
+ }
+
+ [Test]
+ public void KebabCaseNamingStrategyEqualityVariants()
+ {
+ CheckInequality(false, false, true);
+ CheckInequality(false, true, false);
+ CheckInequality(true, false, false);
+ CheckInequality(false, true, true);
+ CheckInequality(true, true, false);
+ CheckInequality(true, true, true);
+ }
[Test]
public void DifferentStrategyEquality()
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ReferenceLoopHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ReferenceLoopHandlingTests.cs
index 6ac582cfe..eb35da396 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/ReferenceLoopHandlingTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/ReferenceLoopHandlingTests.cs
@@ -151,7 +151,7 @@ public void SerializePropertyItemReferenceLoopHandling()
}", json);
}
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Serializable]
public class MainClass : ISerializable
{
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ReflectionAttributeProviderTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ReflectionAttributeProviderTests.cs
index 3e913ff1b..7b9bde821 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/ReflectionAttributeProviderTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/ReflectionAttributeProviderTests.cs
@@ -68,7 +68,7 @@ public ReflectionTestObject(
public void GetAttributes_Property()
{
PropertyInfo property;
-#if DNXCORE50 && !NETSTANDARD2_0
+#if DNXCORE50 && !(NETSTANDARD2_0 || NET6_0_OR_GREATER)
property = Newtonsoft.Json.Utilities.TypeExtensions.GetProperty(typeof(ReflectionTestObject), "TestProperty");
#else
property = typeof(ReflectionTestObject).GetProperty("TestProperty");
@@ -87,7 +87,7 @@ public void GetAttributes_Property()
public void GetAttributes_Field()
{
FieldInfo field;
-#if DNXCORE50 && !NETSTANDARD2_0
+#if DNXCORE50 && !(NETSTANDARD2_0 || NET6_0_OR_GREATER)
field = (FieldInfo)Newtonsoft.Json.Utilities.TypeExtensions.GetField(typeof(ReflectionTestObject), "TestField");
#else
field = typeof(ReflectionTestObject).GetField("TestField");
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs
index b0ffd7125..727684316 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs
@@ -272,7 +272,7 @@ public void SerializationEventContextTestObjectSubClassTest()
}", json);
}
-#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
public class SerializationEventContextTestObject
{
public string TestMember { get; set; }
@@ -303,7 +303,7 @@ public void SerializationEventContextTest()
}
#endif
-#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void WhenSerializationErrorDetectedBySerializer_ThenCallbackIsCalled()
{
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TimeOnlyTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TimeOnlyTests.cs
new file mode 100644
index 000000000..ce9c3d5f7
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Serialization/TimeOnlyTests.cs
@@ -0,0 +1,212 @@
+#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
+
+#if NET6_0_OR_GREATER
+using System;
+using System.Collections.Generic;
+#if !NET20
+using System.Xml.Linq;
+#endif
+#if DNXCORE50
+using Xunit;
+using Test = Xunit.FactAttribute;
+using Assert = Newtonsoft.Json.Tests.XUnitAssert;
+using Xunit.Abstractions;
+#else
+using NUnit.Framework;
+#endif
+
+namespace Newtonsoft.Json.Tests.Serialization
+{
+ [TestFixture]
+ public class TimeOnlyTests : TestFixtureBase
+ {
+ [Test]
+ public void Serialize()
+ {
+ TimeOnly t = new TimeOnly(23, 59, 59);
+ string json = JsonConvert.SerializeObject(t, Formatting.Indented);
+
+ Assert.AreEqual(@"""23:59:59""", json);
+ }
+
+ [Test]
+ public void Serialize_Milliseconds()
+ {
+ TimeOnly t = new TimeOnly(23, 59, 59, 999);
+ string json = JsonConvert.SerializeObject(t, Formatting.Indented);
+
+ Assert.AreEqual(@"""23:59:59.999""", json);
+ }
+
+ [Test]
+ public void SerializeDefault()
+ {
+ TimeOnly t = default;
+ string json = JsonConvert.SerializeObject(t, Formatting.Indented);
+
+ Assert.AreEqual(@"""00:00:00""", json);
+ }
+
+ [Test]
+ public void SerializeMaxValue()
+ {
+ TimeOnly t = TimeOnly.MaxValue;
+ string json = JsonConvert.SerializeObject(t, Formatting.Indented);
+
+ Assert.AreEqual(@"""23:59:59.9999999""", json);
+ }
+
+ [Test]
+ public void SerializeMinValue()
+ {
+ TimeOnly t = TimeOnly.MinValue;
+ string json = JsonConvert.SerializeObject(t, Formatting.Indented);
+
+ Assert.AreEqual(@"""00:00:00""", json);
+ }
+
+ [Test]
+ public void SerializeNullable_Null()
+ {
+ TimeOnly? t = default;
+ string json = JsonConvert.SerializeObject(t, Formatting.Indented);
+
+ Assert.AreEqual("null", json);
+ }
+
+ [Test]
+ public void SerializeNullable_Value()
+ {
+ TimeOnly? t = new TimeOnly(23, 59, 59, 999);
+ string json = JsonConvert.SerializeObject(t, Formatting.Indented);
+
+ Assert.AreEqual(@"""23:59:59.999""", json);
+ }
+
+ [Test]
+ public void SerializeList()
+ {
+ IList l = new List
+ {
+ new TimeOnly(23, 59, 59)
+ };
+ string json = JsonConvert.SerializeObject(l, Formatting.Indented);
+
+ Assert.AreEqual(@"[
+ ""23:59:59""
+]", json);
+ }
+
+ [Test]
+ public void SerializeList_Nullable()
+ {
+ IList l = new List
+ {
+ new TimeOnly(23, 59, 59),
+ null
+ };
+ string json = JsonConvert.SerializeObject(l, Formatting.Indented);
+
+ Assert.AreEqual(@"[
+ ""23:59:59"",
+ null
+]", json);
+ }
+
+ [Test]
+ public void Deserialize()
+ {
+ TimeOnly t = JsonConvert.DeserializeObject(@"""23:59:59""");
+
+ Assert.AreEqual(new TimeOnly(23, 59, 59), t);
+ }
+
+ [Test]
+ public void DeserializeDefault()
+ {
+ TimeOnly t = JsonConvert.DeserializeObject(@"""00:00:00""");
+
+ Assert.AreEqual(default(TimeOnly), t);
+ }
+
+ [Test]
+ public void DeserializeMaxValue()
+ {
+ TimeOnly t = JsonConvert.DeserializeObject(@"""23:59:59.9999999""");
+
+ Assert.AreEqual(TimeOnly.MaxValue, t);
+ }
+
+ [Test]
+ public void DeserializeMinValue()
+ {
+ TimeOnly t = JsonConvert.DeserializeObject(@"""00:00:00""");
+
+ Assert.AreEqual(TimeOnly.MinValue, t);
+ }
+
+ [Test]
+ public void DeserializeNullable_Null()
+ {
+ TimeOnly? t = JsonConvert.DeserializeObject(@"null");
+
+ Assert.AreEqual(null, t);
+ }
+
+ [Test]
+ public void DeserializeNullable_Value()
+ {
+ TimeOnly? t = JsonConvert.DeserializeObject(@"""23:59:59""");
+
+ Assert.AreEqual(new TimeOnly(23, 59, 59), t);
+ }
+
+ [Test]
+ public void DeserializeList()
+ {
+ var l = JsonConvert.DeserializeObject>(@"[
+ ""23:59:59""
+]");
+
+ Assert.AreEqual(1, l.Count);
+ Assert.AreEqual(new TimeOnly(23, 59, 59), l[0]);
+ }
+
+ [Test]
+ public void DeserializeList_Nullable()
+ {
+ var l = JsonConvert.DeserializeObject>(@"[
+ ""23:59:59"",
+ null
+]");
+
+ Assert.AreEqual(2, l.Count);
+ Assert.AreEqual(new TimeOnly(23, 59, 59), l[0]);
+ Assert.AreEqual(null, l[1]);
+ }
+ }
+}
+#endif
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs
index eaab7dec2..86eca4375 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs
@@ -4,7 +4,7 @@
using System.Globalization;
using System.IO;
using Newtonsoft.Json.Linq;
-#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0
+#if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 || NET6_0_OR_GREATER
using System.Numerics;
#endif
using System.Runtime.Serialization;
@@ -121,7 +121,7 @@ public async Task DeserializedJsonWithAlreadyReadReader_Async()
}
#endif
-#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
+#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0 || NET6_0_OR_GREATER
[Test]
public void DiagnosticsTraceWriterTest()
{
@@ -468,7 +468,7 @@ public void Serialize()
{
StringArray = new[] { "1", "2" },
IntList = new List { 1, 2 },
- Version = new Version(1, 2, 3, 4),
+ Version = new VersionOld(1, 2, 3, 4),
StringDictionary =
new Dictionary
{
@@ -489,8 +489,8 @@ public void Serialize()
Assert.AreEqual("Finished serializing System.Collections.Generic.List`1[System.Int32]. Path 'IntList'.", traceWriter.TraceRecords[2].Message);
Assert.AreEqual("Started serializing System.String[]. Path 'StringArray'.", traceWriter.TraceRecords[3].Message);
Assert.AreEqual("Finished serializing System.String[]. Path 'StringArray'.", traceWriter.TraceRecords[4].Message);
- Assert.AreEqual("Started serializing System.Version. Path 'Version'.", traceWriter.TraceRecords[5].Message);
- Assert.AreEqual("Finished serializing System.Version. Path 'Version'.", traceWriter.TraceRecords[6].Message);
+ Assert.AreEqual("Started serializing Newtonsoft.Json.Tests.TestObjects.VersionOld. Path 'Version'.", traceWriter.TraceRecords[5].Message);
+ Assert.AreEqual("Finished serializing Newtonsoft.Json.Tests.TestObjects.VersionOld. Path 'Version'.", traceWriter.TraceRecords[6].Message);
Assert.AreEqual("Started serializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path 'StringDictionary'.", traceWriter.TraceRecords[7].Message);
Assert.AreEqual("Finished serializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path 'StringDictionary'.", traceWriter.TraceRecords[8].Message);
Assert.AreEqual("Finished serializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''.", traceWriter.TraceRecords[9].Message);
@@ -548,9 +548,9 @@ public void Deserialize()
Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Finished deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList'"));
Assert.AreEqual("Started deserializing System.String[]. Path 'StringArray', line 6, position 18.", traceWriter.TraceRecords[3].Message);
Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing System.String[]. Path 'StringArray'"));
- Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 12.", traceWriter.TraceRecords[5].Message);
- Assert.IsTrue(traceWriter.TraceRecords[6].Message.StartsWith("Started deserializing System.Version. Path 'Version'"));
- Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Finished deserializing System.Version. Path 'Version'"));
+ Assert.AreEqual("Deserializing Newtonsoft.Json.Tests.TestObjects.VersionOld using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 12.", traceWriter.TraceRecords[5].Message);
+ Assert.IsTrue(traceWriter.TraceRecords[6].Message.StartsWith("Started deserializing Newtonsoft.Json.Tests.TestObjects.VersionOld. Path 'Version'"));
+ Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.TestObjects.VersionOld. Path 'Version'"));
Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 8.", traceWriter.TraceRecords[8].Message);
Assert.IsTrue(traceWriter.TraceRecords[9].Message.StartsWith("Finished deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary'"));
Assert.IsTrue(traceWriter.TraceRecords[10].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''"));
@@ -611,9 +611,9 @@ public void Populate()
Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Finished deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList'"));
Assert.AreEqual("Started deserializing System.String[]. Path 'StringArray', line 6, position 18.", traceWriter.TraceRecords[3].Message);
Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing System.String[]. Path 'StringArray'"));
- Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 12.", traceWriter.TraceRecords[5].Message);
- Assert.IsTrue(traceWriter.TraceRecords[6].Message.StartsWith("Started deserializing System.Version. Path 'Version'"));
- Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Finished deserializing System.Version. Path 'Version'"));
+ Assert.AreEqual("Deserializing Newtonsoft.Json.Tests.TestObjects.VersionOld using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 12.", traceWriter.TraceRecords[5].Message);
+ Assert.IsTrue(traceWriter.TraceRecords[6].Message.StartsWith("Started deserializing Newtonsoft.Json.Tests.TestObjects.VersionOld. Path 'Version'"));
+ Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.TestObjects.VersionOld. Path 'Version'"));
Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 8.", traceWriter.TraceRecords[8].Message);
Assert.IsTrue(traceWriter.TraceRecords[9].Message.StartsWith("Finished deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary'"));
Assert.IsTrue(traceWriter.TraceRecords[10].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''"));
@@ -751,7 +751,7 @@ public void WriteTypeNameForObjects()
IList