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

Dar*_*xis 6 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

Run Code Online (Sandbox Code Playgroud)

dbc*_*dbc 5

区别如下:

  1. ToObject<T>()是一个反序列化操作。它构造 aJsonSerializer并使用它来将当前反序列化为JToken所需的类型。因此,令牌可以是任何东西(JSON 数组、JSON 对象或 JSON 原始值),序列化程序将使用反射尝试通过使用JTokenReader.

    在编写输入标记和输出类型可以是任何内容的通用代码时,此方法很有用。这是从JToken.

  2. 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>()但它在转换原始值方面的性能会更高,因为序列化程序在反序列化原始值时会在内部调用相同的转换方法。