Вам необходимо указать JsonSerializerSettings
, которое включает в себя подходящее значение TypeNameHandling
. Это включит полное имя в JSON в свойство $type
, которое затем можно будет использовать для десериализации. Вот полный пример:
using System;
using Newtonsoft.Json;
interface IFoo
{
void Method();
}
class Foo1 : IFoo
{
public string Name { get; set; }
public void Method() => Console.WriteLine("Method in Foo1");
}
class Foo2 : IFoo
{
public int Value { get; set; }
public void Method() => Console.WriteLine("Method in Foo2");
}
class Root
{
public IFoo First { get; set; }
public IFoo Second { get; set; }
}
class Test
{
static void Main()
{
Root root = new Root
{
First = new Foo1 { Name = "Fred" },
Second = new Foo2 { Value = 10 }
};
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
string json = JsonConvert.SerializeObject(root, settings);
Console.WriteLine(json);
Root root2 = JsonConvert.DeserializeObject<Root>(json, settings);
root2.First.Method();
root2.Second.Method();
}
}
Вывод, показывающий как JSON, так и тот факт, что свойства интерфейса в Root
были соответствующим образом десериализованы:
{"$type":"Root, Test","First":{"$type":"Foo1, Test","Name":"Fred"},"Second":{"$type":"Foo2, Test","Value":10}}
Method in Foo1
Method in Foo2
Существуют и другие значения TypeNameHandling
, которые вы можете использовать вместо All
- подробности см. В документации .