public void SerializeCircularReferencesWithConverter() { CircularReferenceClass c1 = new CircularReferenceClass { Name = "c1" }; CircularReferenceClass c2 = new CircularReferenceClass { Name = "c2" }; CircularReferenceClass c3 = new CircularReferenceClass { Name = "c3" }; c1.Child = c2; c2.Child = c3; c3.Child = c1; string json = JsonConvert.SerializeObject(c1, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, Converters = new List <JsonConverter> { new CircularReferenceClassConverter() } }); StringAssert.AreEqual(@"{ ""$id"": ""1"", ""$type"": ""CircularReferenceClass"", ""Name"": ""c1"", ""Child"": { ""$id"": ""2"", ""$type"": ""CircularReferenceClass"", ""Name"": ""c2"", ""Child"": { ""$id"": ""3"", ""$type"": ""CircularReferenceClass"", ""Name"": ""c3"", ""Child"": { ""$ref"": ""1"" } } } }", json); }
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer ) { JObject o = JObject.Load(reader); string id = (string)o["$id"]; if (id != null) { CircularReferenceClass circularReferenceClass = new CircularReferenceClass(); serializer.Populate(o.CreateReader(), circularReferenceClass); return(circularReferenceClass); } else { string reference = (string)o["$ref"]; return(serializer.ReferenceResolver.ResolveReference(serializer, reference)); } }
public void DeserializeCircularReferencesWithConverter() { string json = @"{ ""$id"": ""1"", ""$type"": ""CircularReferenceClass"", ""Name"": ""c1"", ""Child"": { ""$id"": ""2"", ""$type"": ""CircularReferenceClass"", ""Name"": ""c2"", ""Child"": { ""$id"": ""3"", ""$type"": ""CircularReferenceClass"", ""Name"": ""c3"", ""Child"": { ""$ref"": ""1"" } } } }"; CircularReferenceClass c1 = JsonConvert.DeserializeObject <CircularReferenceClass>( json, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, Converters = new List <JsonConverter> { new CircularReferenceClassConverter() } } ); Assert.AreEqual("c1", c1.Name); Assert.AreEqual("c2", c1.Child.Name); Assert.AreEqual("c3", c1.Child.Child.Name); Assert.AreEqual("c1", c1.Child.Child.Child.Name); }