JsonSubTypes 1.5.2

There is a newer version of this package available.
See the version list below for details.
Install-Package JsonSubTypes -Version 1.5.2
dotnet add package JsonSubTypes --version 1.5.2
<PackageReference Include="JsonSubTypes" Version="1.5.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add JsonSubTypes --version 1.5.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: JsonSubTypes, 1.5.2"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install JsonSubTypes as a Cake Addin
#addin nuget:?package=JsonSubTypes&version=1.5.2

// Install JsonSubTypes as a Cake Tool
#tool nuget:?package=JsonSubTypes&version=1.5.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

JsonSubTypes a discriminated Json sub-type Converter implementation for .NET

Build status Code Coverage Quality Gate NuGet NuGet

DeserializeObject with custom type property name

[JsonConverter(typeof(JsonSubtypes), "Kind")]
public interface IAnimal
{
    string Kind { get; }
}

public class Dog : IAnimal
{
    public string Kind { get; } = "Dog";
    public string Breed { get; set; }
}

public class Cat : IAnimal {
    public bool Declawed { get; set;}
}

The second parameter of the JsonConverter attribute is the JSON property name that will be use to retreive the type information from JSON.

var animal = JsonConvert.DeserializeObject<IAnimal>("{\"Kind\":\"Dog\",\"Breed\":\"Jack Russell Terrier\"}");
Assert.AreEqual("Jack Russell Terrier", (Animal as Dog)?.Breed);

N.B.: Also works with fully qualified type name

DeserializeObject with custom type mapping

[JsonConverter(typeof(JsonSubtypes), "Sound")]
[JsonSubtypes.KnownSubType(typeof(Dog), "Bark")]
[JsonSubtypes.KnownSubType(typeof(Cat), "Meow")]
public class Animal
{
    public virtual string Sound { get; }
    public string Color { get; set; }
}

public class Dog : Animal
{
    public override string Sound { get; } = "Bark";
    public string Breed { get; set; }
}

public class Cat : Animal
{
    public override string Sound { get; } = "Meow";
    public bool Declawed { get; set; }
}
var animal = JsonConvert.DeserializeObject<IAnimal>("{\"Sound\":\"Bark\",\"Breed\":\"Jack Russell Terrier\"}");
Assert.AreEqual("Jack Russell Terrier", (Animal as Dog)?.Breed);

N.B.: Also works with other kind of value than string, i.e.: enums, int, ...

SerializeObject and DeserializeObject with custom type property only present in JSON

This mode of operation only works when JsonSubTypes is explicitely registered in JSON.NET's serializer settings, and not through the [JsonConverter] attribute.

public abstract class Animal
{
    public int Age { get; set; }
}

public class Dog : Animal
{
    public bool CanBark { get; set; } = true;
}

public class Cat : Animal
{
    public int Lives { get; set; } = 7;
}

public enum AnimalType
{
    Dog = 1,
    Cat = 2
}

Registration:

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

De-/Serialization:

var cat = new Cat { Age = 11, Lives = 6 }

var json = JsonConvert.SerializeObject(cat, settings);

Assert.Equal("{\"Lives\":6,\"Age\":11,\"Type\":2}", json);

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

Assert.Equal(typeof(Cat), result.GetType());
Assert.Equal(11, result.Age);
Assert.Equal(6, (result as Cat)?.Lives);

DeserializeObject mapping by property presence

[JsonConverter(typeof(JsonSubtypes))]
[JsonSubtypes.KnownSubTypeWithProperty(typeof(Employee), "JobTitle")]
[JsonSubtypes.KnownSubTypeWithProperty(typeof(Artist), "Skill")]
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string Department { get; set; }
    public string JobTitle { get; set; }
}

public class Artist : Person
{
    public string Skill { get; set; }
}
string json = "[{\"Department\":\"Department1\",\"JobTitle\":\"JobTitle1\",\"FirstName\":\"FirstName1\",\"LastName\":\"LastName1\"}," +
                "{\"Department\":\"Department1\",\"JobTitle\":\"JobTitle1\",\"FirstName\":\"FirstName1\",\"LastName\":\"LastName1\"}," +
                "{\"Skill\":\"Painter\",\"FirstName\":\"FirstName1\",\"LastName\":\"LastName1\"}]";


var persons = JsonConvert.DeserializeObject<IReadOnlyCollection<Person>>(json);
Assert.AreEqual("Painter", (persons.Last() as Artist)?.Skill);

šŸ’– Support this project

If this project helped you save money or time or simply makes your life also easier, you can give me a cup of coffee =)

  • Support via PayPal
  • Bitcoin ā€” You can send me bitcoins at this address: 33gxVjey6g4Beha26fSQZLFfWWndT1oY3F

NuGet packages (340)

Showing the top 5 NuGet packages that depend on JsonSubTypes:

Package Downloads
Xero.NetStandard.OAuth2

This is a .NETStandard SDK library, used to communicate with the Xero API using OAuth2.0. See https://github.com/XeroAPI/Xero-NetStandard for more information

Lusid.Sdk.Preview

LUSID SDK

Lusid.Sdk

LUSID SDK

InfluxDB.Client

The reference client that allows query, write and management (bucket, organization, users) for the InfluxDB 2.0.

Finbourne.EdpLusidSdk

LUSID SDK for EDP

GitHub repositories (13)

Showing the top 5 popular GitHub repositories that depend on JsonSubTypes:

Repository Stars
antonpup/Aurora
Unified lighting effects across multiple brands and various games.
Bililive/BililiveRecorder
Bē«™å½•ę’­å§¬ | BiliBili Stream Recorder | 哔哩哔哩ē›“ę’­å½•åˆ¶
RyanLamansky/dotnet-webassembly
Create, read, modify, write and execute WebAssembly (WASM) files from .NET-based applications.
jlucansky/Quartzmin
Quartzmin is powerful, easy to use web management tool for Quartz.NET
takuya-takeuchi/DlibDotNet
Dlib .NET wrapper written in C++ and C# for Windows, MacOS, Linux and iOS
Version Downloads Last updated
1.8.0 1,841,438 9/23/2020
1.7.0 1,016,910 3/28/2020
1.6.0 1,424,041 6/24/2019
1.5.2 1,632,965 1/19/2019
1.5.1 217,779 10/15/2018
1.5.0 73,796 8/27/2018
1.4.0 106,760 4/17/2018
1.3.1 3,312 4/12/2018
1.3.0 35,904 1/28/2018
1.2.0 1,993,043 11/22/2017
1.1.3 35,107 11/15/2017
1.1.2 1,518 10/20/2017
1.1.1 1,209 9/21/2017
1.1.0 6,108 9/19/2017
1.0.0 2,265 7/23/2017