我正在尝试在 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”}]
而不是我正在寻找的对象......
在此先感谢您的帮助。