Разница между JToken.ToObject <T>() и JToken.Value <T>() - PullRequest
2 голосов
/ 01 октября 2019

В чем разница между методом JToken.ToObject<T>() и методом расширения JToken.Value<T>() (без параметра key)?

var jToken = JToken.Parse("123");
var toObjectStrResult = jToken.ToObject<string>();
var valueStrResult = jToken.Value<string>();
// toObjectStrResult  == valueStrResult == "123"

var toObjectLongResult = jToken.ToObject<long>();
var valueLongResult = jToken.Value<long>();
// toObjectLongResult  == valueLongResult  == 123L

1 Ответ

2 голосов
/ 01 октября 2019

Разница заключается в следующем:

  1. ToObject<T>() является операцией десериализации . Он создает JsonSerializer и использует его для десериализации текущего JToken до нужного типа. Таким образом, токен может быть чем угодно (массив JSON, объект JSON или значение примитива JSON), и сериализатор, используя отражение, попытается десериализовать токен до нужного типа, прочитав его содержимое с JTokenReader.

    Этот метод полезен при написании универсального кода, где входной токен и тип вывода могут быть любыми. Это наиболее общий и надежный способ создания объекта ac # из JToken.

  2. Extensions.Value<U>(IEnumerable<JToken>) - это преобразование / приведение операция. Он пытается преобразовать значение текущего токена в целевой тип, вызывая Convert.ChangeType() (а также обрабатывая несколько особых случаев).

    Этот методполезно, если вы знаете, что ваш JToken фактически является JValue и вы хотите преобразовать его Value в конкретный требуемый тип примитива .Net. Например, если JValue может содержать long или числовую строку, вы можете преобразовать ее в int, decimal или double. Если он может содержать DateTime или строку в формате ISO 8601 , вы можете преобразовать его в DateTime. И любое примитивное значение JSON всегда может быть преобразовано в строку.

    Хотя этот метод менее универсален, чем ToObject<T>(), он будет более производительным при преобразовании значений примитивов, поскольку сериализатор вызывает те же методы преобразования внутри системы при десериализации примитива. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...