#c# #json.net
Вопрос:
У меня есть следующий метод расширения:
public static T FromJson<T>(JToken json) where T : notnull => json.ToObject<T>();
Обновление до последней версии Json.СЕТЬ, которую я теперь получаю:
Возможное возвращение нулевой ссылки.
Учитывая ограничение шаблона, можно ли игнорировать эту ошибку ? то есть могу ли я добавить восклицательный знак вот так?
public static T FromJson<T>(JToken json) where T : notnull => json.ToObject<T>()!;
Комментарии:
1. Необязательно. Возвращаемое
JValue.CreateNull()
значение не равно nullJToken
, соответствующее строке JSONnull
, но если вы десериализуете его в ссылочный тип, не допускающий значения null, я считаю, что Json. СЕТЬ все равно вернетсяnull
.2. Да, похоже , ваш метод
JsonExtensions.FromJson<SomeReferenceType>(JValue.CreateNull())
вернетсяnull
, см. dotnetfiddle.net/LwqZc8 , потому что ненулевоеJToken
значение может десериализоваться доnull
значения. Видишь dotnetfiddle.net/LwqZc8 . Это ответ на ваш вопрос?
Ответ №1:
Как указано в приведенных выше комментариях @dbc json.ToObject<T>()
все еще может возвращать значение null, даже если T
ограничение равно notnull
В итоге я получил:
public static T FromJson<T>(JToken json) where T : notnull => json.ToObject<T>() ?? throw new ArgumentException(typeof(T).ToString());
Комментарии:
1. Почему вы бросаете
NRE
вместоArgumentException
или любое из его производных исключений?2. Хороший вопрос .. изменился