c#如果对象中的属性不存在,则添加null

Posted

技术标签:

【中文标题】c#如果对象中的属性不存在,则添加null【英文标题】:c# add null if property in an object does not exist 【发布时间】:2022-01-06 21:38:02 【问题描述】:

我有以下响应结构,它将在 API 调用之后被序列化。

public class Details

    public string firstName  get; set; 


public class Result

    public int maxTry  get; set; 
    public int minTry  get; set; 
    public List<Details> aggr  get; set; 
    public List<string> features  get; set; 
    public string zone  get; set; 


[Serializable]
public class Root

    public List<Result> result  get; set; 

我有以下作为 API 响应的对象数组。

"result": [
    
        “maxTry: 17,
        "minTry”: 10,
        "details": [
            
                “firstName”: “Sam”,
            ,
            
                "firstName”: ”Julio”,
            
        ],
        "aggr": [
            “Abc”,
        ],
        "zone": “D3”
    ,
    
        "aggr": [
            "Abc",
        ],
        "zone": “C3”
    ,
    
        "aggr": [
            "Abc",
        ],
        "zone": “B2”
    ,
  ]

问题是即使某些对象在响应中没有maxTryminTry 属性,当我按如下反序列化响应时,

var jobject = JsonConvert.DeserializeObject<Root>(res);

我仍然得到 maxTryminTry 默认为 0 的输出。可以改为默认为 null

【问题讨论】:

【参考方案1】:

当然,通过在int 后面加一个问号使它们可以为空整数

[JsonProperty("maxTry")] //newtonsoft
public int? MaxTry  get; set; 

[JsonProperty("minTry")]
public int? MinTry  get; set; 

JsonProperty 属性让您可以以不同于 json 的方式命名您的 c# 属性,因此无论 json 是什么样子,您都可以保持 c# 命名约定。如果您使用 System.Text.Json 它是 JsonPropertyName 而不是

您的 int 显示为 0 的原因是 int 是值类型,这本质上意味着它们必须有一个值并且不能为空。 int 的默认值为 0;即使您从未为 MaxTry 设置值,它的值也会为 0

var r = new Result();
Console.WriteLine(r.MaxTry); //prints 0

可空整数更难处理,因为它们可能为空;你需要检查if(r.MaxTry.HasValue),如果你想看看它是否为空,然后再对它们做一些事情。在某种程度上,您可能需要重新考虑将它们保留为整数并将 0 视为它们不存在。例如,它可能非常适合您的上下文:

for(int try = 0; try < result.MaxTry; try++)

如果 MaxTry 为 0,则不会运行。如果这是一个问题,那么您需要确定 maxtry 为 0 是否有效,如果不是,则提供一些其他合理的默认值(如果为 0)

【讨论】:

【参考方案2】:

将这些属性更改为nullable int

    public int? maxTry  get; set; 
    public int? minTry  get; set; 

【讨论】:

以上是关于c#如果对象中的属性不存在,则添加null的主要内容,如果未能解决你的问题,请参考以下文章

Graphql - 获取完整的子对象,如果不存在则为 null

检查对象值是不是存在于 Javascript 对象数组中,如果不存在则将新对象添加到数组

如果键不存在则发送 null

如果不存在 C#,则创建应用程序配置文件

使用连接更新表,如果不存在则为 NULL

sql:判断是不是存在相同记录,如果存在则改写,不存在则添加