-
-
Notifications
You must be signed in to change notification settings - Fork 55
Closed
Labels
Milestone
Description
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;
}
}
}
}azixMcAze