使用NewtonSoft.Json反序列化为真实的基础类型

时间:2015-07-17 11:32:36

标签: c# .net json.net

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

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

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

相反,我得到了JObject。我不知道实际的类型应该是什么,而不是事先用手检查Json字符串。

围绕此问题的正确途径是什么?

2 个答案:

答案 0 :(得分:0)

这适合我。

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

答案 1 :(得分:0)

事实证明我不是正如我在问题中所述,毕竟使用相同的序列化设置进行反序列化。这样做,我相信我已经解决了这个问题。

又多了一些白发。