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”
,
]
问题是即使某些对象在响应中没有maxTry
和minTry
属性,当我按如下反序列化响应时,
var jobject = JsonConvert.DeserializeObject<Root>(res);
我仍然得到 maxTry
和 minTry
默认为 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