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
最佳答案
区别如下:
ToObject<T>()
是一个反序列化操作。它构建了一个JsonSerializer
并用它来反序列化当前的JToken
到所需的类型。因此, token 可以是任何东西(JSON 数组、JSON 对象或 JSON 原始值),序列化程序将使用反射,通过使用JTokenReader
读取其内容,尝试将 token 反序列化为所需的类型。 .在编写输入标记和输出类型可以是任何类型的通用代码时,此方法很有用。这是从
JToken
创建 C# 对象的最通用和最安全的方法。 .Extensions.Value<U>(IEnumerable<JToken>)
是一个转换/转换操作。它尝试通过调用Convert.ChangeType()
将当前标记的值 转换为目标类型。 (以及处理一些特殊情况)。当您知道自己的
JToken
时,此方法很有用。实际上是一个JValue
你想转换它的Value
到特定的、必需的 .Net 原始类型。例如,如果JValue
可能包含long
或数字字符串,您可以将其转换为int
, 一个decimal
或double
.如果它可能包含DateTime
或 ISO 8601 中的字符串格式,您可以将其转换为DateTime
.并且任何原始 JSON 值始终可以转换为字符串。虽然此方法不如
ToObject<T>()
通用它在转换原始值时会更高效,因为序列化程序在反序列化原始值时会在内部调用相同的转换方法。
关于c# - JToken.ToObject<T>() 与 JToken.Value<T>() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58188277/