BenMakesGames.JsonDerivesAttribute 0.1.0

Prefix Reserved
dotnet add package BenMakesGames.JsonDerivesAttribute --version 0.1.0
                    
NuGet\Install-Package BenMakesGames.JsonDerivesAttribute -Version 0.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="BenMakesGames.JsonDerivesAttribute" Version="0.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="BenMakesGames.JsonDerivesAttribute" Version="0.1.0" />
                    
Directory.Packages.props
<PackageReference Include="BenMakesGames.JsonDerivesAttribute" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add BenMakesGames.JsonDerivesAttribute --version 0.1.0
                    
#r "nuget: BenMakesGames.JsonDerivesAttribute, 0.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package BenMakesGames.JsonDerivesAttribute@0.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=BenMakesGames.JsonDerivesAttribute&version=0.1.0
                    
Install as a Cake Addin
#tool nuget:?package=BenMakesGames.JsonDerivesAttribute&version=0.1.0
                    
Install as a Cake Tool

What is it?

An alternative API for marking derived classes for JSON serialization and deserialization.

Why?

The default API for registering derived types looks like this:

[JsonDerivedType(typeof(SomeDerivedClass), typeDiscriminator: "some")]
[JsonDerivedType(typeof(SomeOtherDerivedClass), typeDiscriminator: "someOther")]
public interface ISomeInterface
{
    // ...
}

This has some problems:

  1. If you don't own the class, you can't add new derived types.
  2. The list of derived types might become quite long.
  3. JsonDerivedTypeAttribute predates generic attribute support, requiring a touch more boilerplate.
  4. Depending on your use case, you'd probably be happy with a reasonable default for typeDiscriminator rather than having to manually specify it for each class.
  5. You might prefer to see all the configuration about a derived class on that class, rather than having to check all implemented interfaces to find such configuration.

API provided by this package

// nothing to do here!
public interface ISomeInterface
{
    // ...
}

[JsonDerives<ISomeInterface>]
public class SomeDerivedClass : ISomeInterface
{
    // ...
}

[JsonDerives<ISomeInterface>("optionalTypeDiscriminator")]
public class SomeOtherDerivedClass : ISomeInterface
{
    // ...
}

Example usage, assuming classes above

public class CollectionOfObjects
{
    public List<ISomeInterface> Objects { get; set; }
}

var collection = new CollectionOfObjects()
{
    Objects = [
        new SomeDerivedClass(),
        new SomeOtherDerivedClass()
    ]
};

var options = new JsonSerializerOptions();

options.ConfigurePolymorphicTypes(
    discriminatorPropertyName: "$type", // defaults to "$type", so this could be left out in this example
    assemblies: [
        Assembly.GetAssembly(typeof(CollectionOfObjects))!
    ]
);

var json = JsonSerializer.Serialize(collection, options);
var deserialized = JsonSerializer.Deserialize<CollectionOfObjects>(json, options);
Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.0 218 8/17/2025