Skip to content

Support of per inheritance level discriminators #60

@sanzor

Description

@sanzor

If i have a 3-level hierarchy and i place a JsonProperty at first and second level

Animal     
Dog:Animal
Husky:Dog

Can i deserialize like:


var dog=new Husky();
var data= JsonConvert.SerializeObject<Husky>();
Animal a=JsonConvert.DeserializeObject<Animal>();

So far i get an error and i can only deserialize it like this:
Animal a=JsonConvert.DeserializeObject<Dog>();

P.S My question is better seen here https://stackoverflow.com/questions/54835920/deserializing-with-multiple-levels-of-polymorphic-type-hierarchy

Sample code:

using System;
using Newtonsoft.Json;
using JsonSubTypes;

namespace Test60
{
    class Program
    {
        static void Main(string[] args)
        {
            Payload run = new Payload.Game.Run();
            var data = JsonConvert.SerializeObject(run);
            Console.WriteLine(data);
            var run2 = JsonConvert.DeserializeObject<Payload>(data);
            Console.WriteLine("Hello World!");
        }
    }
    [JsonConverter(typeof(JsonSubTypes.JsonSubtypes), _payloadKind)]
    [JsonSubtypes.KnownSubType(typeof(Payload.Game), Discriminator.GAME)]
    [JsonSubtypes.KnownSubType(typeof(Payload.Com), Discriminator.COM)]
    public abstract partial class Payload
    {
        public const string _payloadKind = "$PayloadKind";

        [JsonProperty(_payloadKind)]
        protected abstract Discriminator PayloadKind { get; }
        public Discriminator Kind => this.PayloadKind;
        public enum Discriminator
        {
            COM = 0,
            GAME = 1
        }
    }
    partial class Payload
    {
        [JsonConverter(typeof(JsonSubTypes.JsonSubtypes), GAMEKIND)]
        [JsonSubTypes.JsonSubtypes.KnownSubType(typeof(Game.Run), Discriminator.RUN)]
        [JsonSubTypes.JsonSubtypes.KnownSubType(typeof(Game.Walk), Discriminator.WALK)]
        public abstract partial class Game : Payload
        {
            protected override Payload.Discriminator PayloadKind => Payload.Discriminator.GAME;
            public new enum Discriminator
            {
                RUN = 0,
                WALK = 1
            }
            public const string GAMEKIND = "$GameKind";
            [JsonProperty(GAMEKIND)]
            protected abstract Discriminator GameKind { get; }
            public new Discriminator Kind => this.GameKind;
        }
    }


    partial class Payload
    {
        public abstract class Com : Payload
        {

        }
    }
    partial class Payload
    {
        partial class Game
        {
            public class Walk : Game
            {
                protected override Discriminator GameKind => Discriminator.WALK;
            }
        }
    }

    partial class Payload
    {
        partial class Game
        {
            public class Run : Game
            {
                protected override Discriminator GameKind => Discriminator.RUN;
            }
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions