JSON.net,C#,无法在数据模型中设置默认值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON.net,C#,无法在数据模型中设置默认值相关的知识,希望对你有一定的参考价值。

我正在使用JsonConvert.DeserializeObject(json.ToString());反序列化JSON并在相关模型中填充我的字段。这种方法很有效,直到JSON中缺少数据。基本上没有“key:value”我只会有“key:null”。

我对JsonConverter的理解是它会创建一个对象,我应该能够通过构造函数填充默认值的字段(在我的情况下不会因为未知原因而被调用),或者通过这里提到的标记: Default value for missing properties with JSON.net或在这里:Why when I deserialize with JSON.NET ignores my default value?

我已尝试过两者,但都没有导致相关字段被初始化。当然,如果JSON中没有数据,则无法对相关模型进行反序列化。但是我希望我仍然可以使用默认值初始化一些值,然后JsonConverter会忽略(不会覆盖)(就像现在发生的那样)。然而,这似乎不可能?

以前尝试的源代码

模型类

namespace Project.MyJob
{
    public class JsonModel
    {
        public JsonModel()
        {
            Type_X type_x = new Type_X();
            // This is not doing anything. I would have expected that the 
            // class' constructor would be called but, no.
        }
        public string objectNumber { get; set; }
        public string objectFamily { get; set; }
        public string objectOrder { get; set; }
        public string location { get; set; }
        public string place { get; set; }
        public string inventionTime { get; set; }
        public string lastUpdate { get; set; }
        public string condition { get; set; }

        public Type_X Type_X { get; set; }
        public List<Actions> actions { get; set; }         
    }

    public class Actions
    {
        public string count { get; set; }
        public string datetime { get; set; }
        public string place { get; set; }
        public string status { get; set; }
    }

    public class Type_X
    {  

        public Type_X
        {
          // This should be executed when a new Type_X object is created? Also 
          // not.
          partA = "null";
        }

        [DefaultValue("null")]
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
        public string partA { get; set; }

        // Trying public string partA { get; set; } = "null"; also does 
        // nothing.

        [DefaultValue("null")]
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
        public string PartB { get; set; }

        [DefaultValue("null")]
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
        public string partC { get; set; }

        [DefaultValue("null")]
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
        public string partD { get; set; }

        [DefaultValue("null")]
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
        public string partE { get; set; }
    }
}

使用默认值创建JSON对象(默认值不起作用)

JObject = JsonConvert.DeserializeObject<JsonModel>(json.ToString(), new 
JsonSerializerSettings {DefaultValueHandling = 
DefaultValueHandling.Populate});

下游使用已创建对象的示例

JObject.actions[i].count + "more text"

以上工作时不依赖于默认值。

答案

您使用的是错误的设置。

如果希望在反序列化期间忽略JSON中的null值,则需要在设置中设置NullValueHandling = NullValueHandling.Ignore。默认值为Include,这意味着如果JSON中有特定属性的显式null,则该属性将在您的对象上设置为null,覆盖您可能设置的任何默认值。

DefaultValueHandling.Populate表示如果密钥在JSON中完全丢失(与设置为null不同),则它将使用[DefaultValue]属性提供的值。请注意,如果JSON中有明确的null,则此设置将不使用属性中的默认值,即使NullValueHandling设置为Ignore也是如此。因此,如果您想在该情况下使用默认值,最好的方法是在构造函数中设置它。

所以,简而言之,要获得你想要的行为:

  • 使用NullValueHandling.Ignore设置。
  • 通过构造函数提供默认值。
  • 您不需要DefaultValueHandling设置或[DefaultValue]属性。

演示小提琴:https://dotnetfiddle.net/kyUjFz

以上是关于JSON.net,C#,无法在数据模型中设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

在控制器中设置的用户默认值无法在控制器中读取

如何在实体框架中设置默认值

当模型中设置了默认值时,为啥我会得到“休假是必需的值”?

MVC3:在“仅代码”中设置默认值

无法在 Twitter Bootstrap 切换选项卡中设置默认值

怎么在mysql的字段中设置默认值