在输入API请求中找到未知属性时抛出错误?

时间:2015-05-27 11:32:59

标签: c# .net json asp.net-mvc

目前,我正在将带有JSON字符串的Rest Request作为过滤器传递给Web API,如下所示,

http://localhost:13825/api/values/get?filter={"Name":"abcdef","Address":"Something"}

我有一个类如下,

Public class Customer
{
  public string Name{get;set;}
  public string Address{get;set;}
}

当我使用以下代码将JSON字符串解析为类对象时,它可以正常工作,

public string Get(Customer filter)
{

}

问题是,当我通过如下过滤器时,

filter={"Name":"abcdef","Adess":"Something"}

我的代码将 null 值分配给Customer类的地址属性,但我想在任何类属性中找不到来自JSON字符串的属性时抛出错误

我们可以使用 MissingMemberHandling.Error 但是当包含我们在课堂上定义的所有属性的附加属性时,它会抛出错误。这里的问题不同,我每次都不会传递地址和名称属性。我可能会也可能不会同时通过。

所以我无法提供所需的财产。

我需要在输入JSON字符串中找到未知属性时抛出错误。

3 个答案:

答案 0 :(得分:6)

您可以将JsonSerializerSettings.MissingMemberHandling设置为MissingMemberHandling.Error

  

获取或设置在反序列化期间处理缺少成员的方式(例如,JSON包含不是对象成员的属性)。

如果要全局执行此操作,对于所有控制器,只需将其添加到global.asax

即可
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;

如果您想为特定的操作/控制器执行此操作,则必须实现IControllerConfiguration

public class RejectUnrecognizedPropertiesAttribute : Attribute, IControllerConfiguration 
{
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
    {
        controllerSettings.Formatters.Remove(controllerSettings.Formatters.JsonFormatter);

        var formatter = new JsonMediaTypeFormatter
        {
            SerializerSettings = 
            {
                MissingMemberHandling = MissingMemberHandling.Error
            }
        };

        controllerSettings.Formatters.Add(formatter);
    }
}

只需将[RejectUnrecognizedProperties]属性应用于您的操作/控制器。

答案 1 :(得分:0)

你实际上可以只使用"必需"模型中所需属性的注释。像这样:

Public class Customer
{
  [Required]
  public string Name{get;set;}
  [Required]
  public string Address{get;set;}
}

然后你可以检查一下这个动作:

        if (ModelState.IsValid)
        {
            // Do something with the Customer.

            return new HttpResponseMessage(HttpStatusCode.OK);
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }

答案 2 :(得分:0)

使用JSON.net,您可以定义如下属性:

public class Customer
{
    [JsonProperty(Required = Required.Always)]
    public string Name{ get; set; }

    [JsonProperty(Required = Required.Always)]
    public string Address{ get; set; }
}

然后以这种方式反序列化:

var CustomerInstance = (Customer)JsonConvert.DeserializeObject(JSONString, typeof(Customer));

如果不存在所需的数据,这将引发异常。