簡體   English   中英

如何在布爾屬性為 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,請使用JsonSerializer類的NullValueHandling屬性, 將其設置為 ignore 然后將此JsonSerializer實例JsonSerializerToObject<T>函數的重載。

這告訴序列化忽略任何為 null 的屬性,將屬性初始化為其默認值。 (如果需要,您可以通過System.ComponentModel.DefaultValueAttribute單獨控制該默認值。)

下面的完整編譯示例。 (刪除了對“身體”的引用,以便更容易地關注主要問題。)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM