2015-05-27 30 views
3

目前我通过REST请求以JSON字符串作为过滤器的Web API如下,在输入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"} 

我的代码分配Customer类的地址财产,但我想,当任一类属性是没有发现从JSON字符串的属性抛出一个错误。

我们可以使用MissingMemberHandling.Error但它会抛出错误,当我们在类中定义的所有属性的附加属性。这里的问题情况不同,我不会每次都传递Address和Name属性。我可能会也可能不会通过。

所以我不能提供所需的财产。

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

+0

Address = null;扔;? – Alex

+0

可能的重复[你可以检测到你反序列化的对象是否缺少Json.NET中的JsonConvert类的字段](http://stackoverflow.com/questions/21030712/can-you-detect-if-an-object -you-deserialized-is-missing-a-field-with-the-jsonco) –

+0

@Alex可能地址是可选的,在这种情况下,它*可以为空。 OP要防止的是拼写错误。 – dcastro

回答

5

您可以将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

它为我工作。谢谢 – Rocky

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

这会thr如果需要的数据不存在,则为异常。

相关问题