From 8e1a59b8e6b5b7e28dc1c72a0b71ed99c1414e15 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 12 Nov 2015 23:53:10 +1300 Subject: [PATCH] -Fixed error when ReferenceResolver is set to null --- .../Serialization/JsonSerializerTest.cs | 51 +++++++++++++++++++ Src/Newtonsoft.Json/JsonSerializerSettings.cs | 10 +++- 2 files changed, 60 insertions(+), 1 deletion(-) 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; + } } ///