2017-02-19 136 views
1

當web api需要一個int值時,如果客戶端在JSON中發送null或空字符串,它會自動轉換爲0.我該如何防止這種情況?有這樣的配置嗎?我希望它拋出一個錯誤,因爲它不是它所期望的。Newtonsoft Json.Net空或空字符串轉換

回答

4

您可以用JsonPropery屬性註釋您的DTO /屬性並將其標記爲需要:

public class MyDto 
{ 
    [JsonProperty(Required = Required.Always)] 
    public int RequiredProperty { get;set; } 
} 

有了這個屬性,如果在JSON字符串指定爲屬性的值JsonConvert.DeserializeObject()會拋出異常。

在這裏看到一個例子:https://dotnetfiddle.net/TstCau

+0

實際上,問題是客戶端濫用api,因此他們可能會發送null或「」爲所需的int(而不是int?)。這導致它被反序列化爲0,這是錯誤的。據我所知,你提出的解決方案並不妨礙這一點。總之,我想要的是防止這種自動轉換行爲。 –

+0

@ JohnL.I在修改示例並傳遞''RequiredProperty':'''時仍然會出現異常。如果我理解正確,那就是你想要的。 (見https://dotnetfiddle.net/Fhy5Bf) – M4N

+0

我的錯誤,我會接受你的回答,謝謝。 –

0

你可以通過聲明爲「int?

在此之後,您可以檢查變量是否等於null並給出錯誤消息。

+0

我不希望malform每個數據模型,並添加這樣的檢查。因爲我想要做的是防止錯誤地使用api,所以當發送意外空或「」時,它不會被視爲0.所以,簡而言之,我想要改變這種自動轉換行爲。 –

+0

噢好吧我誤解了這個問題。我很抱歉,但我不知道這是否可能。 – Rick

0

該解決方案也相當一個黑客,不應該定期使用。但是,我們走了。

我有一個問題 - 我想接受我的API作爲字符串的枚舉,但希望他們在我的代碼中作爲枚舉,而不是字符串。

我只是把額外的屬性(可以把一些數據屬性那裏,就像[NotMapped]),並推翻getter和setter像下面

/// <summary> 
    /// Required. A type of the metric for which data is requested. 
    /// </summary> 
    public Metrics MetricType { get; set; } 
    [Required] 
    /// <summary> 
    /// Alias for MetricType. 
    /// </summary> 
    public string Type 
    { 
     get 
     { 
      return MetricType.ToString(); 
     } 
     set 
     { 
      try 
      { 
       MetricType = value.ToEnum<Metrics>(); 
      } 
      catch (System.Exception) 
      { 
       throw new ArgumentException("Invalid Type parameter."); 
      } 
     } 
    } 

我認爲你可以重寫這樣的轉換邏輯。檢查你的字符串爲空或空,併爲你的int分配適當的值。

相關問題