微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

"isValid" 来自输入请求时,我想将 "False" 设置为 null

有人可以建议我怎么做吗?

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,请使用 JsonSerializerNullValueHandlingsetting it to ignore 属性。然后将此 JsonSerializer 实例传递给 ToObject<T> 函数的重载。

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

}
,

这对我有用

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

课程

---
- name: TestingLab
  hosts: localhost
  gather_facts: False
  tasks:
    - name: Hello Vars
      set_fact:
        two_nums:
          - 1
          - 2

    - name: create empty dict
      set_fact:
        ids: {}

    - name: Merge all
      vars:
        single_entry: "{ '{{ item }}': {{ item }} }"
      set_fact:
        ids: "{{ ids | combine(single_entry) }}"
      with_items: "{{ two_nums }}"

    - name: Print Result
      debug:
        msg: "{{ ids }}"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。