C# 在Web Api中对GET请求使用JsonConverter

C# 在Web Api中对GET请求使用JsonConverter,c#,asp.net-web-api,json.net,C#,Asp.net Web Api,Json.net,我有一个抽象类,具有JsonConverter属性,如下所示: [JsonConverter(typeof(SurveyItemConverter))] public abstract class SurveyItem:ISurveyItem { private class SurveyItemConverter : JsonCreationConverter<ISurveyItem> { protected override ISurveyItem

我有一个抽象类,具有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; }
}
处理get请求的控制器有一个带有签名的方法(此方法适用于不支持CORS的浏览器):

[HttpGet]
公共异步任务SubmitSurvey(HttpRequestMessage请求,[FromUri]调查调查)//调查包含一个列表

为什么不使用JsonConverter?如何让JsonConverter使用此方法?

Web API使用内容类型协商来确定要使用的反序列化程序。GET请求没有正文,因此没有内容类型。Web API不希望在URL中找到JSON,因此在本例中它不使用JSON.Net,并且不会调用转换器。显然,最好的选择是使用POST,但如果您必须让它与get一起使用,则需要:

  • 将数据作为标准查询字符串参数(非JSON)发送
  • 以字符串形式从URL获取JSON并手动反序列化;或
  • 实现一个知道要查找什么的自定义绑定器,并将其插入Web API管道

下面是一个可能对前两个选项有所帮助的示例。

Web API使用内容类型协商来确定要使用的反序列化程序。GET请求没有正文,因此没有内容类型。Web API不希望在URL中找到JSON,因此在本例中它不使用JSON.Net,并且不会调用转换器。显然,最好的选择是使用POST,但如果您必须让它与get一起使用,则需要:

  • 将数据作为标准查询字符串参数(非JSON)发送
  • 以字符串形式从URL获取JSON并手动反序列化;或
  • 实现一个知道要查找什么的自定义绑定器,并将其插入Web API管道

下面是一个可能对前两个选项有所帮助的示例。

Web API使用内容类型协商来确定要使用的反序列化程序。GET请求没有正文,因此没有内容类型。Web API不希望在URL中找到JSON,因此在本例中它不使用JSON.Net,并且不会调用转换器。显然,最好的选择是使用POST,但如果您必须让它与get一起使用,则需要:

  • 将数据作为标准查询字符串参数(非JSON)发送
  • 以字符串形式从URL获取JSON并手动反序列化;或
  • 实现一个知道要查找什么的自定义绑定器,并将其插入Web API管道

下面是一个可能对前两个选项有所帮助的示例。

Web API使用内容类型协商来确定要使用的反序列化程序。GET请求没有正文,因此没有内容类型。Web API不希望在URL中找到JSON,因此在本例中它不使用JSON.Net,并且不会调用转换器。显然,最好的选择是使用POST,但如果您必须让它与get一起使用,则需要:

  • 将数据作为标准查询字符串参数(非JSON)发送
  • 以字符串形式从URL获取JSON并手动反序列化;或
  • 实现一个知道要查找什么的自定义绑定器,并将其插入Web API管道
以下是一个可能对前两个选项有所帮助的示例

Cannot create an abstract class
[HttpGet]
public async Task<IHttpActionResult> SubmitSurvey(HttpRequestMessage request, [FromUri] Survey survey)//survey contains a List<SurveyItem>