C# Newtonsoft Json.Net空或空字符串转换

C# Newtonsoft Json.Net空或空字符串转换,c#,json,asp.net-mvc,asp.net-web-api,json.net,C#,Json,Asp.net Mvc,Asp.net Web Api,Json.net,当web api需要int值时,如果客户端发送JSON中的null或空字符串,它将自动转换为0。我怎样才能防止这种情况?有这样的配置吗?我希望它抛出一个错误,因为这不是它所期望的。您可以通过将整数声明为“int”来允许在整数中使用null 在此之后,您只需检查变量是否等于null并给出错误消息。您可以通过将整数声明为“int”来允许在整数中使用null 在此之后,您只需检查变量是否等于null并给出错误消息。您可以使用jsonproperty属性注释DTO/属性,并根据需要进行标记: publi

当web api需要int值时,如果客户端发送JSON中的null或空字符串,它将自动转换为0。我怎样才能防止这种情况?有这样的配置吗?我希望它抛出一个错误,因为这不是它所期望的。

您可以通过将整数声明为“int”来允许在整数中使用null


在此之后,您只需检查变量是否等于null并给出错误消息。

您可以通过将整数声明为“int”来允许在整数中使用null


在此之后,您只需检查变量是否等于null并给出错误消息。

您可以使用
jsonproperty
属性注释DTO/属性,并根据需要进行标记:

public class MyDto
{
    [JsonProperty(Required = Required.Always)]
    public int RequiredProperty { get;set; }
}
使用此属性,
JsonConvert.DeserializeObject()
将在JSON字符串中未指定属性值时引发异常


请参见此处的示例:

您可以使用
jsonproperty
属性对DTO/属性进行注释,并根据需要进行标记:

public class MyDto
{
    [JsonProperty(Required = Required.Always)]
    public int RequiredProperty { get;set; }
}
使用此属性,
JsonConvert.DeserializeObject()
将在JSON字符串中未指定属性值时引发异常


请参见此处的示例:

此解决方案也是一种黑客攻击,不应定期使用。但我们走了

我遇到了一个问题——我想接受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.");
            }
        }
    }
//
///必需的。为其请求数据的度量的一种类型。
/// 
公共度量MetricType{get;set;}
[必需]
/// 
///MetricType的别名。
/// 
公共字符串类型
{
得到
{
返回MetricType.ToString();
}
设置
{
尝试
{
MetricType=value.ToEnum();
}
捕获(系统异常)
{
抛出新ArgumentException(“无效类型参数”);
}
}
}

我想你可以像那样重写转换逻辑。检查字符串是否为null或空,并为int指定适当的值。

此解决方案也是一种黑客行为,不应定期使用。但我们走了

我遇到了一个问题——我想接受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.");
            }
        }
    }
//
///必需的。为其请求数据的度量的一种类型。
/// 
公共度量MetricType{get;set;}
[必需]
/// 
///MetricType的别名。
/// 
公共字符串类型
{
得到
{
返回MetricType.ToString();
}
设置
{
尝试
{
MetricType=value.ToEnum();
}
捕获(系统异常)
{
抛出新ArgumentException(“无效类型参数”);
}
}
}

我想你可以像那样重写转换逻辑。检查字符串是否为null或空,并为int指定适当的值。

我不想对每个数据模型进行错误格式化并添加这样的检查。因为我想做的是防止api的错误使用,以便在意外地发送null或“”时,它不会被视为0。总之,我想改变这种自动转换行为。哦,好吧,我误解了这个问题。很抱歉,但我不知道这是否可行。我不想对每个数据模型进行错误格式化并添加这样的检查。因为我想做的是防止api的错误使用,以便在意外地发送null或“”时,它不会被视为0。总之,我想改变这种自动转换行为。哦,好吧,我误解了这个问题。很抱歉,我不知道这是否可能。事实上,问题是客户端滥用api,因此他们可能会发送null或“”作为所需的int(不是int?)。这会导致将其反序列化为0,这是错误的。据我所知,你提出的解决方案并不能阻止这一点。简言之,我想要的是防止这种自动转换行为。@JohnL.当我修改示例并传递
'RequiredProperty':''
时,我仍然会遇到一个异常。如果我理解正确,那就是你想要的。(请参阅)实际上,问题在于客户端滥用api,因此可能会发送null或“”作为所需的int(而不是int?)。这会导致将其反序列化为0,这是错误的。据我所知,你提出的解决方案并不能阻止这一点。简言之,我想要的是防止这种自动转换行为。@JohnL.当我修改示例并传递
'RequiredProperty':''
时,我仍然会遇到一个异常。如果我理解正确,那就是你想要的。(见附件)