当前位置: 首页 > 知识库问答 >
问题:

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

慕容越泽
2023-03-14

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

我对JsonConverter的理解是,它将创建一个对象,在这个对象中,我应该能够通过构造函数(在我的情况下,由于未知原因没有调用)或通过这里提到的标记(JSON缺少属性的默认值)用默认值填充字段。net或here:为什么我用JSON反序列化。NET忽略我的默认值?

我两者都尝试过,但都不会导致相关字段被初始化。当然,如果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"

当不依赖于默认值时,上述方法有效。

共有1个答案

包兴思
2023-03-14

您使用了错误的设置。

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

<代码>默认值处理。填充意味着如果JSON中完全缺少键(这与设置为null不同),那么它将使用由属性提供的值。请注意,如果JSON中有一个显式的null,即使将null值处理设置为Ignore,此设置也不会使用属性中的默认值。因此,如果在这种情况下需要默认值,最好的方法是在构造函数中设置它。

因此,简而言之,要获得您想要的行为:

  • 使用NullValueHandling。忽略设置

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

 类似资料:
  • 我在Windows 10上使用的是VSCode 1.47.3。我无法编辑json中的默认设置: 打开默认设置(“文件 - 我尝试过以管理员身份打开VSCode,卸载并重新安装,重新启动计算机,并将其降级到1.46,但仍然无法编辑。有人知道如何解决这个问题吗?

  • 基本上我想知道,如果得到空值,如何将默认值设置为Pojo变量? 我在项目中使用了Spring数据Cassandra。布尔列中的某些条目为null,当我从数据库中提取记录时,它会引发以下错误: 布尔值不能为null 甚至我也面临着同样的问题。。。列。 因此,当数据库的列为null时,我想给这些字段一个默认值。 这是我希望的最后一个例子: 我已经了解了//...但是我什么都没有。 请帮帮我。

  • 我正在使用postgreSQL 9.3.1,spring 4和JPA 1.9进行我的项目。我需要使用下面的JPA代码为数据库中的一列设置默认值。此外,我还尝试在代码中传递数据类型“整数”和“int”。但仍然没有设置默认值。任何人都可以建议我缺少什么或我需要为JPA 1.9做任何设置吗? 提前感谢。 @Column(name=“cust_id”,columnDefinition = “int def

  • 我在Thymeleaf模板中的样式标记内设置CSS字体变量。字体值来自模型对象。我还想应用默认颜色,以防模型attirbute不存在。我使用elvis运算符选择默认值elvis运算符链接 但是当我呈现模板时,它会搜索brandingConfig,然后是themeConfig,然后是fontName,但fontName在themeConfig中不存在。因此,它不会选择默认值,而是抛出一个错误。下面是

  • 在我的quarkus应用程序中有两个命名的数据源,我们称之为A和B: Quarkus.datasource.a.db-kind=Oracle Quarkus.datasource.b.db-kind=Oracle 因此,每次应用程序启动时,我都会收到这样的通知: 警告:无法确定默认数据源的数据库类型

  • 本文向大家介绍mysql中datetime类型设置默认值方法,包括了mysql中datetime类型设置默认值方法的使用技巧和注意事项,需要的朋友参考一下 通过navicat客户端修改datetime默认值时,遇到了问题。 数据库表字段类型datetime,原来默认为NULL,当通过界面将默认值设置为当前时间时,提示“1067-Invalid default value for 'CREATE_T