TransplantingJsonConverter 1.0.1

.NET Standard 2.0
NuGet\Install-Package TransplantingJsonConverter -Version 1.0.1
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.
dotnet add package TransplantingJsonConverter --version 1.0.1
<PackageReference Include="TransplantingJsonConverter" Version="1.0.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add TransplantingJsonConverter --version 1.0.1
#r "nuget: TransplantingJsonConverter, 1.0.1"
#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 TransplantingJsonConverter as a Cake Addin
#addin nuget:?package=TransplantingJsonConverter&version=1.0.1

// Install TransplantingJsonConverter as a Cake Tool
#tool nuget:?package=TransplantingJsonConverter&version=1.0.1

Transplanting JSON Converter

A JSON converter (for use with Newtonsoft Json.NET), that transplants properties from an inner root object, to an outer container object. The serialized JSON looks like that of the inner root object, but augmented with other properties found on the outer container object. Deserialization is supported as well.

Example

Outermost container type

A Container type facilitates serialization and deserialization that centers around a particular inner root type, augmented with additional properties.

Container class must be decorated with JsonTransplantContainer attribute, and it is suggested that it also be decorated with a JsonConverter attribute dictating JsonTransplantConverter as shown.

The container class must have exactly one public property decorated with JsonTransplantRoot attribute. The JSON output object will center around "Rewt" and will not actually have a property called "Rewt". It will, however, have properties called "Other1" and "Other2".

[JsonTransplantContainer]
[JsonConverter(typeof(JsonTransplantConverter))]
public class Container
{
    [JsonTransplantRoot]
    public Rewt Rewt { get; set; }

    public Other1 Other1 { get; set; }

    public Other2 Other2 { get; set; }
}

Inner root type

The JSON output will center around this type. There's no attribute clutter here.

public class Rewt
{
    public int RootA { get; set; }

    public int RootB { get; set; }

    public int A { get; set; }

    public int B { get; set; }
}

Augmentation types

Optionally, standard Newtonsoft attributes may be used to control serialization.

public class Other1
{
    public int A { get; set; }
}

public class Other2
{
    public int B { get; set; }

    [JsonIgnore]
    public string DontSerialize { get; set; } = "a value";
}

JSON output

The output is centered around the "Rewt" type, which is considered the "inner root" in the C# type (as designated using JsonTransplantRoot attribute), but serves as (part of) the outer schema in the JSON output. The "Other1" and "Other2" properties have been serialized as if we weren't using any special converter. Note that properties belonging to the "Other" types (ex. Other1.A) are not grafted on to the root type.

The "A" and "B" properties on the "Other" types are completely unrelated to their namesakes on the "Rewt" type.

{
  "RootA": 100,
  "RootB": 200,
  "A": 101,
  "B": 201,
  "Other1": {
    "A": 1000
  },
  "Other2": {
    "B": 2000
  }
}

TODOS

Use better terminology here. ❝Inner root❞? Really⁇

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

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
1.0.1 203 8/14/2021
1.0.0 240 6/12/2021