使用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字符串,我不知道实际的类型应该是什么。
解决这个问题的正确途径是什么?
这对我很有用。
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 不是我在问题中所说的,毕竟使用相同的序列化器设置来反序列化。这样我相信我已经解决了这个问题。
又长了几根白头发