TransplantingJsonConverter 1.0.1

dotnet add package TransplantingJsonConverter --version 1.0.1                
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.
<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 and Polyglot Notebooks. 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 Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
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 391 8/14/2021
1.0.0 407 6/12/2021