https://github.com/aviationexam/json-converter-source-generator
Source generated polymorphic JSON converters
https://github.com/aviationexam/json-converter-source-generator
csharp-sourcegenerator dotnet enum-serialization json polymorphic-types system-text-json
Last synced: 5 months ago
JSON representation
Source generated polymorphic JSON converters
- Host: GitHub
- URL: https://github.com/aviationexam/json-converter-source-generator
- Owner: aviationexam
- License: mit
- Created: 2023-09-25T19:44:29.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-05T15:12:03.000Z (5 months ago)
- Last Synced: 2024-11-05T16:29:42.308Z (5 months ago)
- Topics: csharp-sourcegenerator, dotnet, enum-serialization, json, polymorphic-types, system-text-json
- Language: C#
- Homepage:
- Size: 296 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
- RSCG_Examples - https://github.com/aviationexam/json-converter-source-generator
- csharp-source-generators - GeneratedJsonConverters -   - generate json converters for polymorph contracts and string based enum serialization. (Source Generators / Serialization)
README
[](https://github.com/aviationexam/json-converter-source-generator/actions/workflows/build.yml)
[](https://www.nuget.org/packages/Aviationexam.GeneratedJsonConverters.SourceGenerator/)
[](https://www.myget.org/feed/json-converter-source-generator/package/nuget/Aviationexam.GeneratedJsonConverters.SourceGenerator)
[](https://f.feedz.io/aviationexam/json-converter-source-generator/packages/Aviationexam.GeneratedJsonConverters.SourceGenerator/latest/download)# Aviationexam.GeneratedJsonConverters.SourceGenerator
Motivation for this library are polymorphic contracts with discriminator property not present as first property.
i.e. this JSON
```json
{
"baseProperty": 1,
"$type": 2,
"anotherLeafProperty": 2
}
```
is deserialized correctly into `AnotherLeafContract` using this library.And string based enum serialization.
## Install
```xml
```
## How to use library
```xml
public
NamespaceOf.My.Json.Serializer.Context
MyJsonSerializerContext
BackingType
UseBackingType|UseEnumName```
```cs
// file=contracts.cs
using Aviationexam.GeneratedJsonConverters.Attributes;[JsonPolymorphic] // notice, that attributes are from `Aviationexam.GeneratedJsonConverters.Attributes` namespace, not `System.Text.Json.Serialization`
[JsonDerivedType(typeof(LeafContract), typeDiscriminator: nameof(LeafContract))]
[JsonDerivedType(typeof(AnotherLeafContract), typeDiscriminator: 2)]
[JsonDerivedType(typeDiscriminator: nameof(GenericLeafContract))]
public abstract class BaseContract
{
public int BaseProperty { get; set; }
}
public sealed class LeafContract : BaseContract
{
public int LeafProperty { get; set; }
}
public sealed class AnotherLeafContract : BaseContract
{
public int AnotherLeafProperty { get; set; }
}
public sealed class GenericLeafContract : BaseContract
{
public int Property { get; set; }
}[EnumJsonConverter] // this use project defined configuration
public enum EMyEnum
{
[EnumMember(Value = "C")]
A,
[EnumMember(Value = "D")]
B,
}[EnumJsonConverter(
SerializationStrategy = EnumSerializationStrategy.FirstEnumName,
DeserializationStrategy = EnumDeserializationStrategy.UseEnumName
)]
public enum EMyEnumWithExplicitConfiguration
{
[EnumMember(Value = "C")]
A,
[EnumMember(Value = "D")]
B,
}[DisableEnumJsonConverter]
public enum EMyIgnoredEnum
{
C,
D,
}// file=MyJsonSerializerContext.cs
using System.Text.Json.Serialization;[JsonSerializable(typeof(BaseContract))] // this line is neccesary, generator searches for JsonSerializableAttribute with argument type decorated by JsonPolymorphicAttribute
[JsonSerializable(typeof(LeafContract))] // notice, it's necessary to specify leaf types
[JsonSerializable(typeof(AnotherLeafContract))]
[JsonSerializable(typeof(GenericLeafContract))][JsonSerializable(typeof(EMyEnum))] // only necessary for not referenced enums from other contracts
[JsonSerializable(typeof(EMyEnumWithExplicitConfiguration))]
public partial class MyJsonSerializerContext : JsonSerializerContext
{
static MyJsonSerializerContext()
{
// register generated converters to options
UsePolymorphicConverters(s_defaultOptions.Converters);
UseEnumConverters(s_defaultOptions.Converters);#if NET8_0_OR_GREATER
Default = new MyJsonSerializerContext(new System.Text.Json.JsonSerializerOptions(s_defaultOptions));
#endif
}
}
```