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
答案 0 :(得分:2)
区别如下:
ToObject<T>()
是反序列化操作。它构造一个JsonSerializer
并将其用于将当前JToken
反序列化为所需的类型。这样,令牌可以是任何东西(JSON数组,JSON对象或JSON基本值),并且序列化程序将使用反射尝试通过使用{{3}读取其内容将令牌反序列化为所需类型。 }。
在编写通用代码(输入令牌和输出类型可以是任何东西)时,此方法很有用。这是从JToken
创建c#对象的最通用且最安全的方法。
JTokenReader
是转换/广播操作。它尝试通过调用Extensions.Value<U>(IEnumerable<JToken>)
(以及处理一些特殊情况)将当前令牌的 value 转换为目标类型。
当您知道您的JToken
实际上是Convert.ChangeType()
并且想将其JValue
转换为特定的必需.Net基本类型时,此方法很有用。例如,如果JValue
可能包含long
或数字字符串,则可以将其转换为int
,decimal
或double
。如果它可能包含DateTime
或Value
格式的字符串,则可以将其转换为DateTime
。而且任何原始JSON值都可以始终转换为字符串。
虽然此方法不如ToObject<T>()
通用,但在转换原始值时会更高效,因为在反序列化原始图元时,序列化程序会在内部调用相同的转换方法。