#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; }