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"}]
私が探しているオブジェクトの代わりに...
助けてくれてありがとう。