【问题标题】: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

标签: c# .net c#-4.0


【解决方案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 链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多