Web API序列化/反序列化派生类型

时间:2016-09-28 13:33:23

标签: asp.net-web-api json.net xml-serialization xml-deserialization json-deserialization

我有一个Web API,它返回一个对象列表,当客户端通过Accept application / json时,我希望我的全局注册的json格式化程序在序列化期间为派生类型包含TypeNameHandling。然而,这不起作用,我不明白为什么这不起作用?

我的对象

public class BaseClass 
{
    public int Id { get; set; }
}

public class SubClass : BaseClass
{
    public string SubClassProp { get; set; }
}

public class SubClassA : SubClass
{
    public string SubClassAProp { get; set; }
}

public class SubClassB : SubClass
{
   public string SubClassBProp { get; set; }
}

WebApiConfig

public static void Register(HttpConfiguration config) 
{
   var formatters = GlobalConfiguration.Configuration.Formatters;
   var jsonFormatter = formatters.JsonFormatter;
   var settings = jsonFormatter.SerializerSettings;
   settings.Formatting = Formatting.Indented;
   settings.NullValueHandling = NullValueHandling.Ignore;
   settings.TypeNameHandling = TypeNameHandling.Auto;
}

Web API控制器

public class MyController : ApiController
{
    [HttpGet]
    public async Task<IList<BaseClass>> GetClasses() 
    {
       return new List<BaseClass>
              {
                 new SubClassA 
                 { 
                    Id = 1, 
                    SubClassProp = "SubClass", 
                    SubClassAProp = "SubClassAProp"
                 },
                 new SubClassB
                 {
                    Id = 2, 
                    SubClassProp = "SubClass", 
                    SubClassBProp = "SubClassBProp"
                 }
              };
    }
}

在同一解决方案中从API客户端调用

var client = new HttpClient() { BaseAddress = new Uri("uri goes here...")}
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var resp = await client.GetAsync("uri goes here..."));
var jsonContent = await resp.Content.ReadAsStringAsync();

var ListOfClasses = JsonConvert.DeserializeObject<IList<BaseClass>>(jsonContent, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });

我希望得到一个SubClassA元素和一个SubClassB元素,但两者都是BaseClass?

我还希望可以在Post方法中将json反序列化为对象。

这对于json和xml都应该是可能的

0 个答案:

没有答案