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

How to provide the Default value to a boolean property when it was null

在下面的代码中我得到一个异常,因为 "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>();

假设您使用的是 Newtonsoft.Json,请使用 NullValueHandling property of the JsonSerializer class, setting it to ignore。然后将 JsonSerializer 的实例传递给 ToObject<T> 函数的重载。

这告诉序列化忽略任何为空的属性,使 属性 初始化为其默认值。 (如果需要,您可以通过 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; }
    }

}

这对我有用

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