我有一个正在使用的 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 反序列化,这应该可以工作。
在此先感谢您的帮助。