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

标签 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. ToObject<T>() 是一个反序列化操作。它构建了一个 JsonSerializer 并用它来反序列化当前的 JToken到所需的类型。因此, token 可以是任何东西(JSON 数组、JSON 对象或 JSON 原始值),序列化程序将使用反射,通过使用 JTokenReader 读取其内容,尝试将 token 反序列化为所需的类型。 .

    在编写输入标记和输出类型可以是任何类型的通用代码时,此方法很有用。这是从 JToken 创建 C# 对象的最通用和最安全的方法。 .

  2. Extensions.Value<U>(IEnumerable<JToken>) 是一个转换/转换操作。它尝试通过调用 Convert.ChangeType() 将当前标记的 转换为目标类型。 (以及处理一些特殊情况)。

    当您知道自己的 JToken 时,此方法很有用。实际上是一个 JValue 你想转换它的 Value 到特定的、必需的 .Net 原始类型。例如,如果 JValue可能包含 long或数字字符串,您可以将其转换为 int , 一个 decimaldouble .如果它可能包含 DateTimeISO 8601 中的字符串格式,您可以将其转换为 DateTime .并且任何原始 JSON 值始终可以转换为字符串。

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

关于c# - JToken.ToObject<T>() 与 JToken.Value<T>() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58188277/

相关文章:

c# - 如何使用 Json.NET 反序列化一个高精度的十进制值?

c# - 从 ModelState 中删除 JSON.net 序列化异常

c# - ajax jquery post,需要对初学者进行一些微调

c# - EF : order by 2 fields when they are not null

c# - "Using"输出参数

json - 在 URL 中使用 JSON 保存 Web 应用程序状态是否更可取?

c# - 解析这种json字符串化的字符串 "{\"值\":[\"18\"]}"

c# - 当 json 中的 id 属性充当对象时创建 POCO

c# - ASP.NET 持久缓存 ("Lazy loading"风格?)

javascript - 如何使用 JSON 数据创建 CanvasJS 图表?