使用NewtonSoft.Json反序列化为真正的底层类型

本文关键字:类型 NewtonSoft Json 反序列化 使用 | 更新日期: 2023-09-27 18:03:17

如果我用new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }将对象序列化为Json,则Json包含类型名称。例如

{
    "$type": "MyDomain.Customers.SubscribedToNewsletter, MyDomain",
    "NewsletterName": "top",
}

因此,当我使用var evt = JsonConvert.DeserialiseObject(json, settings);相同的设置时,我希望它检查Json字符串中编码的$type并返回该类型的对象。

相反,我得到一个JObject。如果没有事先手工检查Json字符串,我不知道实际的类型应该是什么。

解决这个问题的正确途径是什么?

使用NewtonSoft.Json反序列化为真正的底层类型

这对我很有用。

namespace TypeNameHandlingTest
{
    using System;
    using Newtonsoft.Json;
    public class Foo
    {
        public string Bar { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var foo = new Foo { 
                Bar = "bar" 
            };
            var settings = new JsonSerializerSettings { 
                TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All 
            };
            var json = JsonConvert.SerializeObject(foo, settings);
            object deserialized = JsonConvert.DeserializeObject(json, settings);
            Console.WriteLine(deserialized.GetType().AssemblyQualifiedName);
            Console.ReadLine();
        }
    }
}
输出:

TypeNameHandlingTest.Foo, TypeNameHandlingTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

事实证明I 不是我在问题中所说的,毕竟使用相同的序列化器设置来反序列化。这样我相信我已经解决了这个问题。

又长了几根白头发