C# 如何使用JsonConverter MVC 3基于继承反序列化ASP.net Web API输入

C# 如何使用JsonConverter MVC 3基于继承反序列化ASP.net Web API输入,c#,asp.net,asp.net-mvc,json,json.net,C#,Asp.net,Asp.net Mvc,Json,Json.net,我试图在ASP.net Web Api MVC 3应用程序中实现一个非常简单的JsonConverter。以前这是不可能的,因为WCF客户端默认使用Microsoft序列化 无论如何,我想发送我的API一些Json像这样 [{ "WorkerID" : 456, "Company" : "ACompany", "DOB" : "asdasd" }, { "ContactId" : 123, "Name" : "roger", "DOB" : "asdasd" }] 并让API知道将Json反序

我试图在ASP.net Web Api MVC 3应用程序中实现一个非常简单的JsonConverter。以前这是不可能的,因为WCF客户端默认使用Microsoft序列化

无论如何,我想发送我的API一些Json像这样

[{
"WorkerID" : 456,
"Company" : "ACompany",
"DOB" : "asdasd"
},
{
"ContactId" : 123,
"Name" : "roger",
"DOB" : "asdasd"
}]
并让API知道将Json反序列化成什么类型的对象。目前,虽然我的代码只是将其反序列化为基本对象。因此,如果Json对象具有WorkerID属性,则反序列化将知道它是工作者对象,或者如果它具有ContactId,则知道它是联系人

下面是一些代码,希望能让它更清楚

[ServiceContract]
public class ContactsApi
{
    [WebInvoke(Method = "POST", UriTemplate = "", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    public List<Person> Get(List<Person> input)
    {
        return input; 
    }
}

public class Worker : Person
{
    public int WorkerID { get; set; }
    public string Company { get; set; }
    public string DOB { get; set; }
}

public class Contact : Person
{
    public int ContactId { get; set; }
    public string Name { get; set; }
    public string DOB { get; set; }
}

[JsonConverter(typeof(PersonConverter))]
public class Person
{
    string DOB { get; set; }
}

public class PersonConverter : JsonConverter
{
    public override bool CanWrite { get { return false; } }

    protected Person Create(Type objectType, JObject jObject)
    {
        if (!string.IsNullOrEmpty(jObject.Value<string>("Company")))
        {
            return new Worker();
        }
        else if (!string.IsNullOrEmpty(jObject.Value<string>("Name")))
        {
            return new Contact();
        }
        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        //base.WriteJson(writer, value, serializer);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;

        var jObject = JObject.Load(reader);

        var target = Create(objectType, jObject);
        serializer.Populate(jObject.CreateReader(), target);

        return target;
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(Person).IsAssignableFrom(objectType);
    }
}
[服务合同]
公共类联系人
{
[WebInvoke(Method=“POST”,UriTemplate=“”,RequestFormat=WebMessageFormat.Json,ResponseFormat=WebMessageFormat.Json)]
公共列表获取(列表输入)
{
返回输入;
}
}
公营班级工作人员:人
{
public int WorkerID{get;set;}
公共字符串公司{get;set;}
公共字符串DOB{get;set;}
}
公共类联系人:人
{
public int ContactId{get;set;}
公共字符串名称{get;set;}
公共字符串DOB{get;set;}
}
[JsonConverter(类型(PersonConverter))]
公共阶层人士
{
字符串DOB{get;set;}
}
公共类PersonConverter:JsonConverter
{
公共重写bool可以写入{get{return false;}}
受保护人员创建(类型objectType,JObject JObject)
{
如果(!string.IsNullOrEmpty(jObject.Value(“公司”))
{
返回新工人();
}
如果(!string.IsNullOrEmpty(jObject.Value(“Name”)),则为else
{
返回新联系人();
}
返回null;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
//base.WriteJson(writer、value、serializer);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
if(reader.TokenType==JsonToken.Null)
返回null;
var jObject=jObject.Load(读卡器);
var target=Create(objectType,jObject);
填充(jObject.CreateReader(),目标);
回报目标;
}
公共覆盖布尔CanConvert(类型objectType)
{
返回类型(Person).IsAssignableFrom(objectType);
}
}
所以,目前这只是反序列化为Person对象,而我认为它应该反序列化为Worker或Contact对象。我得到的回应是

[{DOB:asdasd},{DOB:asdasd}]

而不是我要找的东西


提前谢谢你的帮助

请参阅中的序列化/反序列化代码。问题在于,他没有对传入数据进行反序列化,并将其映射到web api中的类。如果我只是使用转换器对JSON字符串进行反序列化,我的方法就可以工作。但我无法让API在自动反序列化传入数据时使用转换器运行。谢谢你的帮助。