diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index b80de6b1..4f01a765 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -8478,6 +8478,57 @@ Path '', line 1, position 1."); ]", json); } + [Test] + public void NullReferenceResolver() + { + PersonReference john = new PersonReference + { + Id = new Guid("0B64FFDF-D155-44AD-9689-58D9ADB137F3"), + Name = "John Smith" + }; + + PersonReference jane = new PersonReference + { + Id = new Guid("AE3C399C-058D-431D-91B0-A36C266441B9"), + Name = "Jane Smith" + }; + + john.Spouse = jane; + jane.Spouse = john; + + IList people = new List + { + john, + jane + }; + + string json = JsonConvert.SerializeObject(people, new JsonSerializerSettings + { +#pragma warning disable 618 + ReferenceResolver = null, +#pragma warning restore 618 + PreserveReferencesHandling = PreserveReferencesHandling.Objects, + Formatting = Formatting.Indented + }); + + StringAssert.AreEqual(@"[ + { + ""$id"": ""1"", + ""Name"": ""John Smith"", + ""Spouse"": { + ""$id"": ""2"", + ""Name"": ""Jane Smith"", + ""Spouse"": { + ""$ref"": ""1"" + } + } + }, + { + ""$ref"": ""2"" + } +]", json); + } + #if !(PORTABLE || PORTABLE40 || NETFX_CORE || DNXCORE50) [Test] public void SerializeDictionaryWithStructKey() diff --git a/Src/Newtonsoft.Json/JsonSerializerSettings.cs b/Src/Newtonsoft.Json/JsonSerializerSettings.cs index 96587c77..7c0bb65c 100644 --- a/Src/Newtonsoft.Json/JsonSerializerSettings.cs +++ b/Src/Newtonsoft.Json/JsonSerializerSettings.cs @@ -216,10 +216,18 @@ namespace Newtonsoft.Json get { if (ReferenceResolverProvider == null) + { return null; + } + return ReferenceResolverProvider(); } - set { ReferenceResolverProvider = () => value; } + set + { + ReferenceResolverProvider = (value != null) + ? () => value + : (Func)null; + } } ///