c# добавьте значение null, если свойство в объекте не существует

#c# #asp.net-mvc

Вопрос:

У меня есть следующая структура ответа, которая будет сериализована после вызова API.

 public class Details {  public string firstName { get; set; } }  public class Result {  public int maxTry { get; set; }  public int minTry { get; set; }  public Listlt;Detailsgt; aggr { get; set; }  public Listlt;stringgt; features { get; set; }  public string zone { get; set; } }  [Serializable] public class Root {  public Listlt;Resultgt; 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.DeserializeObjectlt;Rootgt;(res);  

Я все еще получаю вывод с maxTry и minTry по умолчанию равен 0. Может ли это быть вместо этого по умолчанию null

Ответ №1:

Конечно, сделайте их недействительными, поставив знак вопроса после int

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

Атрибут JsonProperty позволяет вам называть ваше свойство c# иначе, чем json, поэтому вы можете соблюдать соглашения об именовании c# независимо от того, как выглядит json. Если вы используете 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 lt; result.MaxTry; try  )  

Это не будет выполняться, если MaxTry равно 0.. если это проблема, то вам нужно решить, допустимо ли когда-либо значение maxtry, равное 0, а если нет, укажите другое разумное значение по умолчанию, если оно равно 0

Ответ №2:

Измените эти свойства на nullable int

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