如何在布尔属性为空时为其提供默认值

Posted

技术标签:

【中文标题】如何在布尔属性为空时为其提供默认值【英文标题】:How to provide the Default value to a boolean property when it was null 【发布时间】:2021-09-30 03:51:23 【问题描述】:

在下面的代码中,我遇到了一个异常,因为 "isValid" 来自输入请求的 null

当输入请求中的null 时,我想将"isValid" 设置为"False"

谁能建议我如何做到这一点?

public class Details

    public string status  get; set; 
    public MessageInfo messageInfo  get; set; 


public class MessageInfo

    public bool isValid  get; set; 


var inputMessage =

    "Body":
    
     "status":"success",
     "MessageInfo": 
      
        "isValid":null
      
    


var messagebody = inputMessage.Body.ToObject<Details>();

【问题讨论】:

这不会编译) 我现在已经更正了 inputMessage @GuruStron 【参考方案1】:

这对我有用

void Main()

    var inputMessage = " \"Body\":\"status\":\"success\", \"MessageInfo\":\"isValid\":null ";

   var inputMessageObj= JsonConvert.DeserializeObject<Root>(inputMessage);

public class Details

    public string status  get; set; 
    public MessageInfo messageInfo  get; set; 



public class MessageInfo


    private bool? _isValid = false;
    public bool? IsValid
    
        get  return _isValid; 
        set  _isValid = value == null ? false : value; 
    


    public class Body
    
        public string Status  get; set; 
        public MessageInfo MessageInfo  get; set; 
    

public class Root

    public Body Body  get; set; 

    

【讨论】:

【参考方案2】:

假设您正在使用 Newtonsoft.Json,请使用 JsonSerializer 类的 NullValueHandling 属性 setting it to ignore。然后将JsonSerializer 的这个实例传递给ToObject&lt;T&gt; 函数的重载。

这告诉序列化忽略任何为空的属性,将属性初始化为其默认值。 (如果需要,您可以通过System.ComponentModel.DefaultValueAttribute 单独控制该默认值。)

下面的完整编译示例。 (删除了对“Body”的引用,以便更容易关注主要问题。)

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace SomeNamespace

    public class Program
    
        private static void Main()
        
            var inputMessage = JToken.Parse(
            @"
                ""status"":""success"",
                ""MessageInfo"": 
                
                    ""isValid"":null
                
            ");
            
            // build a custom serializer with a setting to ignore null
            var jsonSettings = new JsonSerializerSettings
            
                NullValueHandling = NullValueHandling.Ignore,
            ;
            var serializer = JsonSerializer.Create(jsonSettings);

            // using the serializer with custom settings avoids the original exception
            var messagebody = inputMessage.ToObject<Details>(serializer);
        
    

    public class Details
    
        public string status  get; set; 
        public MessageInfo messageInfo  get; set; 
    

    public class MessageInfo
    
        public bool isValid  get; set; 
    


【讨论】:

感谢您的回答。在上述解决方案中,您忽略了 Null Value 字段,但在我的情况下,当 isValid 为 Null 时,我想将默认值分配为“False”。 bool 的默认值已经是false,因此从技术上讲,您无需执行任何其他操作。但是,如果您想明确设置默认值,请调查答案中的DefaultValueAttribute 链接。

以上是关于如何在布尔属性为空时为其提供默认值的主要内容,如果未能解决你的问题,请参考以下文章

如何在用户首次安装应用程序时为用户提供默认密码?

当值为空或为空时如何返回默认值

参数标志,不使用时为空,不使用时为默认值

x-editable,当字符串为空时如何显示特定值?

如何在 Code First 模型中的布尔值上设置默认值?

vue中当数据为空时的处理