【问题标题】:c# add null if property in an object does not existc#如果对象中的属性不存在,则添加null
【发布时间】: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

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案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; }
      

      【讨论】:

        猜你喜欢
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2012-07-19
        • 2017-06-11
        • 1970-01-01
        • 2012-08-01
        • 1970-01-01
        相关资源
        最近更新 更多