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
Run Code Online (Sandbox Code Playgroud)
区别如下:
ToObject<T>()是一个反序列化操作。它构造 aJsonSerializer并使用它来将当前反序列化为JToken所需的类型。因此,令牌可以是任何东西(JSON 数组、JSON 对象或 JSON 原始值),序列化程序将使用反射尝试通过使用JTokenReader.
在编写输入标记和输出类型可以是任何内容的通用代码时,此方法很有用。这是从JToken.
Extensions.Value<U>(IEnumerable<JToken>)是转换/铸造操作。它尝试通过调用(以及处理一些特殊情况)将当前标记的值转换为目标类型Convert.ChangeType()。
当您知道JToken实际上是 aJValue并且想要将其转换Value为特定的、必需的 .Net 原始类型时,此方法很有用。例如,如果JValue可能包含 along或数字字符串,您可以将其转换为 an int、 adecimal或 a double。如果它可能包含ISO 8601格式的aDateTime或字符串,您可以将其转换为. 并且任何原始 JSON 值始终可以转换为字符串。DateTime
虽然此方法不太通用,ToObject<T>()但它在转换原始值方面的性能会更高,因为序列化程序在反序列化原始值时会在内部调用相同的转换方法。