当输入的API请求中发现未知属性时,是否应抛出错误?

4

目前,我正在按以下方式将带有JSON字符串过滤器的Rest请求传递给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类的Address属性,但当JSON字符串中的属性在任何类属性中都找不到时,我希望抛出错误。

我们可以使用MissingMemberHandling.Error,但它会在具有我们在类中定义的所有属性的附加属性时抛出错误。这里的问题情况是不同的,我不会每次都传递Address和Name属性。我可能会传递或者不传递两个属性中的一个或全部。

因此,我无法提供所需的属性。

当在输入的JSON字符串中发现未知属性时,我需要抛出错误。


Address=null; throw; 怎么样? - user786
@Alex也许地址是可选的,在这种情况下它可以为空。OP想要避免的是打错字。 - dcastro
@dcastro是正确的,他的答案有效 :) - Rocky
3个回答

8
您可以将 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]属性应用于您的操作/控制器即可。


0

实际上,您可以在模型中的必需属性上使用“Required”注释。像这样:

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);
        }

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));

如果必需的数据不存在,这将抛出一个异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接