JToken.ToObject <T>()与JToken.Value <T>()之间的区别

时间:2019-10-01 15:42:44

标签: c# json json.net

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 个答案:

答案 0 :(得分:2)

区别如下:

  1. ToObject<T>()反序列化操作。它构造一个JsonSerializer并将其用于将当前JToken反序列化为所需的类型。这样,令牌可以是任何东西(JSON数组,JSON对象或JSON基本值),并且序列化程序将使用反射尝试通过使用{{3}读取其内容将令牌反序列化为所需类型。 }。

    在编写通用代码(输入令牌和输出类型可以是任何东西)时,此方法很有用。这是从JToken创建c#对象的最通用且最安全的方法。

  2. JTokenReader转换/广播操作。它尝试通过调用Extensions.Value<U>(IEnumerable<JToken>)(以及处理一些特殊情况)将当前令牌的 value 转换为目标类型。

    当您知道您的JToken实际上是Convert.ChangeType()并且想将其JValue转换为特定的必需.Net基本类型时,此方法很有用。例如,如果JValue可能包含long或数字字符串,则可以将其转换为intdecimaldouble。如果它可能包含DateTimeValue格式的字符串,则可以将其转换为DateTime。而且任何原始JSON值都可以始终转换为字符串。

    虽然此方法不如ToObject<T>()通用,但在转换原始值时会更高效,因为在反序列化原始图元时,序列化程序会在内部调用相同的转换方法。