我有一个带有 JsonConverter 属性的抽象类,如下所示:
[JsonConverter(typeof(SurveyItemConverter))]
public abstract class SurveyItem:ISurveyItem
{
private class SurveyItemConverter : JsonCreationConverter<ISurveyItem>
{
protected override ISurveyItem Create(Type objectType, Newtonsoft.Json.Linq.JObject jObject)
{
var type = (SurveyItemType)jObject.Value<int>("Type");
switch (type)
{
case SurveyItemType.Label:
return new SurveyLabel();
case SurveyItemType.Textbox:
return new SurveyTextbox();
case SurveyItemType.TextArea:
return new SurveyTextArea();
case SurveyItemType.CheckBoxGroup:
return new SurveyCheckboxGroup();
case SurveyItemType.Checkbox:
return new SurveyCheckbox();
case SurveyItemType.RadioGroup:
return new SurveyRadioGroup();
case SurveyItemType.RadioButton:
return new SurveyRadioButton();
case SurveyItemType.Email:
return new SurveyEmail();
case SurveyItemType.Telephone:
return new SurveyTelephone();
case SurveyItemType.Number:
return new SurveyNumber();
case SurveyItemType.DateTime:
return new SurveyDate();
case SurveyItemType.Password:
return new SurveyPassword();
case SurveyItemType.Url:
return new SurveyUrl();
case SurveyItemType.ProfileName:
return new SurveyProfileName();
default:
throw new ArgumentOutOfRangeException();
}
}
}
public string Label { get; set; }
public int Id { get; set; }
public SurveyItemType Type { get; set; }
}
如果请求是 POST/PUT,则此方法可以正常工作,但是对于 GET 请求,它会失败:
Cannot create an abstract class
处理 get 请求的控制器具有带有签名的方法(此方法适用于不支持 CORS 的浏览器):
[HttpGet]
public async Task<IHttpActionResult> SubmitSurvey(HttpRequestMessage request, [FromUri] Survey survey)//survey contains a List<SurveyItem>
为什么不使用 JsonConverter? 如何让 JsonConverter 使用此方法?
Web API 使用内容类型协商来确定要使用的反序列化程序。 GET 请求没有正文,因此没有内容类型。 Web API 不希望在 URL 中找到 JSON,因此在这种情况下它不使用 Json.Net,并且不会调用转换器。 显然,最好的选择是使用 POST,但如果你必须让它与 GET 一起工作,你需要
:- 将数据作为标准查询字符串参数(不是 JSON)发送;
- 从URL中获取字符串中的JSON,并手动反序列化它;或
- 实现一个自定义绑定程序,该绑定程序知道要查找的内容并将其插入到 Web API 管道中
这是一个类似的问题,可能对前两个选项有所帮助。