1

我有一个正在使用的 MVC 3 Web 应用程序/API,我对默认的 Microsoft 序列化感到非常厌倦。MVC 4 中新的 ASP.net Web Api 的一大承诺是它将默认使用 JSON.net 反序列化。好吧,我很想默认使用 JSON 反序列化,而不是弄乱 WCF 客户端。我遇到的一个问题是由于各种原因我无法转换为 MVC 4。

所以我的问题是我仍然可以默认使用 MVC 3 的 Json.net 反序列化吗?

我具体要做的是实现一个 Json 转换器来处理我正在反序列化的对象的继承。这样如果我发送这个 Json,API 就知道要返回什么类型的对象。

我按照这里的文章在 MVC 3 应用程序中创建了一个 ASP.net Web api。

http://wcf.codeplex.com/wikipage?title=Getting%20started:%20Building%20a%20simple%20web%20api

所以如果我发送 JSON ......

[{
    "WokerId" : "456",
    "Company" : "ACompany",
    "DOB" : "asdasd"
},
{
    "ContactId" : "123",
    "Name" : "Johnny Funtime",
    "DOB" : "asdasd"
}]

对于这个服务合同/API,我会得到适当的回应。

[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 class Contact : Person
{
    public int ContactId { get; set; }
    public string Name { get; set; }
}

[JsonConverter(typeof(PersonConverter))]
public abstract class Person
{
    public 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 是抽象的),但我相信如果我使用 Json.Net 反序列化,这应该可以工作。

在此先感谢您的帮助。

4

0 回答 0