目前,我正在将带有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字符串中找到未知属性时抛出错误。
答案 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));
如果不存在所需的数据,这将引发异常。