Skip to content

Commit

Permalink
Add version of builder methods with generic types for cleaner syntax.
Browse files Browse the repository at this point in the history
  • Loading branch information
mjamro committed Jul 3, 2020
1 parent 239eadf commit 2f7a589
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 0 deletions.
20 changes: 20 additions & 0 deletions JsonSubTypes.Tests/DynamicRegisterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Animal>("type")
.SerializeDiscriminatorProperty()
.RegisterSubtype<Cat>(AnimalType.Cat)
.RegisterSubtype<Dog>(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()
{
Expand Down
19 changes: 19 additions & 0 deletions JsonSubTypes.Tests/DynamicRegisterWithPropertyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Animal>()
.RegisterSubtypeWithProperty<Cat>("catLives")
.RegisterSubtypeWithProperty<Dog>("CanBark")
.Build());

var json = "{\"catLives\":11,}";

var result = JsonConvert.DeserializeObject<Animal>(json);

Assert.AreEqual(typeof(Cat), result.GetType());
}
}
}
15 changes: 15 additions & 0 deletions JsonSubTypes/JsonSubtypesConverterBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ public static JsonSubtypesConverterBuilder Of(Type baseType, string discriminato
return customConverterBuilder;
}

public static JsonSubtypesConverterBuilder Of<T>(string discriminatorProperty)
{
return Of(typeof(T), discriminatorProperty);
}

public JsonSubtypesConverterBuilder SerializeDiscriminatorProperty()
{
return SerializeDiscriminatorProperty(false);
Expand All @@ -62,12 +67,22 @@ public JsonSubtypesConverterBuilder RegisterSubtype(Type subtype, object value)
return this;
}

public JsonSubtypesConverterBuilder RegisterSubtype<T>(object value)
{
return RegisterSubtype(typeof(T), value);
}

public JsonSubtypesConverterBuilder SetFallbackSubtype(Type fallbackSubtype)
{
_fallbackSubtype = fallbackSubtype;
return this;
}

public JsonSubtypesConverterBuilder SetFallbackSubtype<T>(object value)
{
return RegisterSubtype(typeof(T), value);
}

public JsonConverter Build()
{
return new JsonSubtypesByDiscriminatorValueConverter(_baseType, _discriminatorProperty, _subTypeMapping, _serializeDiscriminatorProperty, _addDiscriminatorFirst, _fallbackSubtype);
Expand Down
15 changes: 15 additions & 0 deletions JsonSubTypes/JsonSubtypesWithPropertyConverterBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,33 @@ public static JsonSubtypesWithPropertyConverterBuilder Of(Type baseType)
return new JsonSubtypesWithPropertyConverterBuilder(baseType);
}

public static JsonSubtypesWithPropertyConverterBuilder Of<T>()
{
return Of(typeof(T));
}

public JsonSubtypesWithPropertyConverterBuilder RegisterSubtypeWithProperty(Type subtype, string jsonPropertyName)
{
_subTypeMapping.Add(jsonPropertyName, subtype);
return this;
}

public JsonSubtypesWithPropertyConverterBuilder RegisterSubtypeWithProperty<T>(string jsonPropertyName)
{
return RegisterSubtypeWithProperty(typeof(T), jsonPropertyName);
}

public JsonSubtypesWithPropertyConverterBuilder SetFallbackSubtype(Type fallbackSubtype)
{
_fallbackSubtype = fallbackSubtype;
return this;
}

public JsonSubtypesWithPropertyConverterBuilder SetFallbackSubtype<T>()
{
return SetFallbackSubtype(typeof(T));
}

public JsonConverter Build()
{
return new JsonSubtypesByPropertyPresenceConverter(_baseType, _subTypeMapping, _fallbackSubtype);
Expand Down
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ public enum AnimalType
```

### Registration:

```csharp
var settings = new JsonSerializerSettings();
settings.Converters.Add(JsonSubtypesConverterBuilder
Expand All @@ -109,6 +110,18 @@ settings.Converters.Add(JsonSubtypesConverterBuilder
.Build());
```

or using syntax with generics:

```csharp
var settings = new JsonSerializerSettings();
settings.Converters.Add(JsonSubtypesConverterBuilder
.Of<Animal>("Type") // type property is only defined here
.RegisterSubtype<Cat>(AnimalType.Cat)
.RegisterSubtype<Dog>(AnimalType.Dog)
.SerializeDiscriminatorProperty() // ask to serialize the type property
.Build());
```

### De-/Serialization:
```csharp
var cat = new Cat { Age = 11, Lives = 6 }
Expand Down Expand Up @@ -148,6 +161,8 @@ public class Artist : Person
}
```

or using syntax with generics:


```csharp
string json = "[{\"Department\":\"Department1\",\"JobTitle\":\"JobTitle1\",\"FirstName\":\"FirstName1\",\"LastName\":\"LastName1\"}," +
Expand All @@ -169,6 +184,17 @@ settings.Converters.Add(JsonSubtypesWithPropertyConverterBuilder
.Build());
```

or

```cs
settings.Converters.Add(JsonSubtypesWithPropertyConverterBuilder
.Of<Person>()
.RegisterSubtypeWithProperty<Employee>("JobTitle")
.RegisterSubtypeWithProperty<Artist>("Skill")
.Build());
```


## A default class other than the base type can be defined

```cs
Expand Down

0 comments on commit 2f7a589

Please sign in to comment.