diff --git a/JsonSubTypes.Tests/DynamicRegisterTests.cs b/JsonSubTypes.Tests/DynamicRegisterTests.cs index 3c4f392..c4de678 100644 --- a/JsonSubTypes.Tests/DynamicRegisterTests.cs +++ b/JsonSubTypes.Tests/DynamicRegisterTests.cs @@ -131,6 +131,26 @@ public void SerializeTest() Assert.AreEqual(json, result); } + [Test] + public void RegisterWithGenericTypes() + { + var settings = new JsonSerializerSettings(); + JsonConvert.DefaultSettings = () => settings; + + settings.Converters.Add(JsonSubtypesConverterBuilder + .Of("type") + .SerializeDiscriminatorProperty() + .RegisterSubtype(AnimalType.Cat) + .RegisterSubtype(AnimalType.Dog) + .Build()); + + var json = "{\"catLives\":6,\"age\":11,\"type\":2}"; + + var result = JsonConvert.SerializeObject(new Cat { Age = 11, Lives = 6 }); + + Assert.AreEqual(json, result); + } + [Test] public void UnregisteredTypeSerializeTest() { diff --git a/JsonSubTypes.Tests/DynamicRegisterWithPropertyTests.cs b/JsonSubTypes.Tests/DynamicRegisterWithPropertyTests.cs index a56cb2b..b575d0f 100644 --- a/JsonSubTypes.Tests/DynamicRegisterWithPropertyTests.cs +++ b/JsonSubTypes.Tests/DynamicRegisterWithPropertyTests.cs @@ -296,5 +296,24 @@ public void TestNestedObjectInBothWayParallel() Parallel.For(0, 100, index => test()); } + + [Test] + public void RegisterWithGeneric() + { + var settings = new JsonSerializerSettings(); + JsonConvert.DefaultSettings = () => settings; + + settings.Converters.Add(JsonSubtypesWithPropertyConverterBuilder + .Of() + .RegisterSubtypeWithProperty("catLives") + .RegisterSubtypeWithProperty("CanBark") + .Build()); + + var json = "{\"catLives\":11,}"; + + var result = JsonConvert.DeserializeObject(json); + + Assert.AreEqual(typeof(Cat), result.GetType()); + } } } diff --git a/JsonSubTypes/JsonSubtypesConverterBuilder.cs b/JsonSubTypes/JsonSubtypesConverterBuilder.cs index 1c09897..49c5c48 100644 --- a/JsonSubTypes/JsonSubtypesConverterBuilder.cs +++ b/JsonSubTypes/JsonSubtypesConverterBuilder.cs @@ -44,6 +44,11 @@ public static JsonSubtypesConverterBuilder Of(Type baseType, string discriminato return customConverterBuilder; } + public static JsonSubtypesConverterBuilder Of(string discriminatorProperty) + { + return Of(typeof(T), discriminatorProperty); + } + public JsonSubtypesConverterBuilder SerializeDiscriminatorProperty() { return SerializeDiscriminatorProperty(false); @@ -62,12 +67,22 @@ public JsonSubtypesConverterBuilder RegisterSubtype(Type subtype, object value) return this; } + public JsonSubtypesConverterBuilder RegisterSubtype(object value) + { + return RegisterSubtype(typeof(T), value); + } + public JsonSubtypesConverterBuilder SetFallbackSubtype(Type fallbackSubtype) { _fallbackSubtype = fallbackSubtype; return this; } + public JsonSubtypesConverterBuilder SetFallbackSubtype(object value) + { + return RegisterSubtype(typeof(T), value); + } + public JsonConverter Build() { return new JsonSubtypesByDiscriminatorValueConverter(_baseType, _discriminatorProperty, _subTypeMapping, _serializeDiscriminatorProperty, _addDiscriminatorFirst, _fallbackSubtype); diff --git a/JsonSubTypes/JsonSubtypesWithPropertyConverterBuilder.cs b/JsonSubTypes/JsonSubtypesWithPropertyConverterBuilder.cs index 57ed436..72cbe21 100644 --- a/JsonSubTypes/JsonSubtypesWithPropertyConverterBuilder.cs +++ b/JsonSubTypes/JsonSubtypesWithPropertyConverterBuilder.cs @@ -20,18 +20,33 @@ public static JsonSubtypesWithPropertyConverterBuilder Of(Type baseType) return new JsonSubtypesWithPropertyConverterBuilder(baseType); } + public static JsonSubtypesWithPropertyConverterBuilder Of() + { + return Of(typeof(T)); + } + public JsonSubtypesWithPropertyConverterBuilder RegisterSubtypeWithProperty(Type subtype, string jsonPropertyName) { _subTypeMapping.Add(jsonPropertyName, subtype); return this; } + public JsonSubtypesWithPropertyConverterBuilder RegisterSubtypeWithProperty(string jsonPropertyName) + { + return RegisterSubtypeWithProperty(typeof(T), jsonPropertyName); + } + public JsonSubtypesWithPropertyConverterBuilder SetFallbackSubtype(Type fallbackSubtype) { _fallbackSubtype = fallbackSubtype; return this; } + public JsonSubtypesWithPropertyConverterBuilder SetFallbackSubtype() + { + return SetFallbackSubtype(typeof(T)); + } + public JsonConverter Build() { return new JsonSubtypesByPropertyPresenceConverter(_baseType, _subTypeMapping, _fallbackSubtype); diff --git a/README.md b/README.md index 00e3a1a..0b17b2d 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ public enum AnimalType ``` ### Registration: + ```csharp var settings = new JsonSerializerSettings(); settings.Converters.Add(JsonSubtypesConverterBuilder @@ -109,6 +110,18 @@ settings.Converters.Add(JsonSubtypesConverterBuilder .Build()); ``` +or using syntax with generics: + +```csharp +var settings = new JsonSerializerSettings(); +settings.Converters.Add(JsonSubtypesConverterBuilder + .Of("Type") // type property is only defined here + .RegisterSubtype(AnimalType.Cat) + .RegisterSubtype(AnimalType.Dog) + .SerializeDiscriminatorProperty() // ask to serialize the type property + .Build()); +``` + ### De-/Serialization: ```csharp var cat = new Cat { Age = 11, Lives = 6 } @@ -148,6 +161,8 @@ public class Artist : Person } ``` +or using syntax with generics: + ```csharp string json = "[{\"Department\":\"Department1\",\"JobTitle\":\"JobTitle1\",\"FirstName\":\"FirstName1\",\"LastName\":\"LastName1\"}," + @@ -169,6 +184,17 @@ settings.Converters.Add(JsonSubtypesWithPropertyConverterBuilder .Build()); ``` +or + +```cs +settings.Converters.Add(JsonSubtypesWithPropertyConverterBuilder + .Of() + .RegisterSubtypeWithProperty("JobTitle") + .RegisterSubtypeWithProperty("Skill") + .Build()); +``` + + ## A default class other than the base type can be defined ```cs