1

我正在尝试在 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);
    }
}

所以目前这被反序列化为 Person 对象,当我相信它应该将它反序列化为 Worker 或 Contact 对象。我得到的回应将是……

[{出生日期:“asdasd”},{出生日期:“asdasd”}]

而不是我正在寻找的对象......

在此先感谢您的帮助。

4

0 回答 0