【问题标题】:JSON.net, C#, unable to set default values in data modelJSON.net,C#,无法在数据模型中设置默认值
【发布时间】:2018-06-03 21:50:40
【问题描述】:

我正在使用 JsonConvert.DeserializeObject(json.ToString()); 反序列化 JSON 并在相关模型中填充我的字段。在 JSON 中缺少数据之前,这很有效。基本上,我将只有“key:null”,而不是“key:value”。

我对 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 中有 "key": null 。这与根本不存在真的不同。 null 是一个有效值,因此它被分配。我会说默认值只有在 JSON 中完全丢失密钥的情况下才会生效。以及为什么你认为构造函数没有被调用。你在那里设置断点了吗?
  • 从@Daniel 所说的开始,JsonSerializerSettings 有一个NullValueHandling 属性。
  • 啊,有趣的见解。我将尝试从我的 json 中删除这个尾随数据集,看看会发生什么。

标签: c# json.net


【解决方案1】:

您使用了错误的设置。

如果您希望在反序列化过程中忽略 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

【讨论】:

  • 这是迄今为止我找到的最佳答案。非常感谢。
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多