public void RoundtripsPolymorphicTypesUsingDiscriminators() { serializer.EnableDiscriminators( new Discriminator <Base>("B"), new Discriminator <Derived1>("D1"), new Discriminator <Derived2>("D2")); var jObject = JObject.FromObject(new Base { BaseChild = new Derived1(), BaseChildren = new List <Base> { new Base(), new Derived2(), } }, CreateSerializer()); ((JObject)jObject["BaseChild"]).ShouldContainKeyAndValue("Discriminator", "D1"); var jListWrapper = (JObject)jObject["BaseChildren"]; var jList = (JArray)jListWrapper["$values"]; ((JObject)jList[0]).ShouldContainKeyAndValue("Discriminator", "B"); ((JObject)jList[1]).ShouldContainKeyAndValue("Discriminator", "D2"); var copy = jObject.ToObject <Base>(CreateSerializer()); copy.BaseChild.ShouldBeOfType <Derived1>(); copy.BaseChildren.ShouldBeOfType <List <Base> >(); copy.BaseChildren[0].ShouldBeOfType <Base>(); copy.BaseChildren[1].ShouldBeOfType <Derived2>(); }