1

ASP.net Web Api MVC 3 アプリケーションに非常に単純な JsonConverter を実装しようとしています。以前は、WCF クライアントが既定で Microsoft シリアル化を使用していたため、これは不可能でした。

とにかく、このような Json を API に送信したいと思います...

[{
"WorkerID" : 456,
"Company" : "ACompany",
"DOB" : "asdasd"
},
{
"ContactId" : 123,
"Name" : "roger",
"DOB" : "asdasd"
}]

そして、Json を逆シリアル化するオブジェクトのタイプを API に認識させます。現在、私のコードはベースオブジェクトのみを逆シリアル化しています。したがって、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 オブジェクトに逆シリアル化する必要があると私は信じています。私が得ている応答は、次のようなものになるでしょう...

[{DOB : "asdasd"}, {DOB : "asdasd"}]

私が探しているオブジェクトの代わりに...

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

4

0 に答える 0