1

使用している 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 デシリアライゼーションを使用していれば、これは機能するはずです。

助けてくれてありがとう。

4

0 に答える 0