使用している MVC 3 Web アプリケーション/API があり、デフォルトの Microsoft シリアル化にひどくうんざりしています。MVC 4 の新しい ASP.net Web Api の大きな約束は、デフォルトで JSON.net デシリアライゼーションを使用することです。デフォルトで JSON デシリアライゼーションを使用し、WCF クライアントを台無しにしたくありません。私が抱えている問題の 1 つは、さまざまな理由で 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"
}]
この Service Contract / 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 は abstract であるため) が、Json.Net デシリアライゼーションを使用していれば、これは機能するはずです。
助けてくれてありがとう。