gpt4 book ai didi

c# - 如何解析 Newtonsoft JSON 中的 TimeSpan 值

转载 作者:太空狗 更新时间:2023-10-30 01:07:07 25 4
gpt4 key购买 nike

我想解析 JSON 字符串并使用 token.Type 属性检测 JTokenType.TimeSpan 类型的值。

我不知道如何在我的输入字符串中表达 TimeSpan,所有内容似乎都被解释为 JTokenType.String。

var timeSpanString = TimeSpan.FromHours(1).ToString();
testString = string.Format(@"{{""Value"": ""{0}"" }}", timeSpanString);
var statObject = JObject.Parse(testString);
JToken token = statObject["Value"];
var tokenValue = token.ToString();
var tokenType = token.Type; // JTokenType.String

我什至试过:

JValue jValue = new JValue("test");
jValue.Value = TimeSpan.FromHours(1);
bool isTimeSpan = jValue.Type == JTokenType.TimeSpan; // true!
testString = string.Format(@"{{""Value"": ""{0}"" }}", jValue.Value);
var statObject = JObject.Parse(testString);
JToken token = statObject["Value"];
var tokenValue = token.ToString();
var tokenType = token.Type; // JTokenType.String

它至少生成了一个 token 类型为 JTokenType.TimeSpan 的 JValue 对象,但在我解析它时仍然显示为 JTokenType.String。

这非常适用于 DateTime 对象。如何表达输入字符串,使解析的值类型为 JTokenType.TimeSpan

最佳答案

根据我在一段时间内使用 JSON.NET 时所看到的,使用默认设置,您永远不会解析字符串并检索类型为 JTokenType.TimeSpan 的 token (相同对于其他一些类型,例如 Guid 或 Uri)。我很清楚为什么会这样(根据我几年前使用 DataContractJsonSerializer 工作的经验)。

基本上,这取决于解析器可以从输入中检索出多少信息。 JSON 是一种非常简单的语法,它只知道数字 bool 值字符串(除了数组和对象)。许多 CLR 类型没有 native JSON 类型(Uri、DateTime、DateTimeOffset、TimeSpan 等),因此当任何 JSON 解析器读取数据时,它会尝试使用最佳匹配。

如果您将 JSON 字符串反序列化为 CLR 数据类型,那么序列化程序有一些额外的信息,它可以使用这些信息来消除 JSON 字符串映射到的内容的歧义 - 值被反序列化到的字段/属性的类型.但是,当您将 JSON 数据反序列化为 JToken 对象图时,没有其他信息,JSON.NET 必须选择一种类型。反序列化 JSON 字符串的最自然类型是 CLR 字符串。

但为什么日期被正确反序列化为 JTokenType.Date? IIRC,JSON.NET 阅读器有一个特殊的日期代码(由 DateParseHandling 枚举控制),它试图将解析的字符串与一些预定义的格式(ISO 8601 或旧的 Microsoft ASP.NET)匹配AJAX 格式),如果找到匹配的字符串,它会将其读取为 DateTime(或 DateTimeOffset)而不是字符串。我不知道是否可以将该行为扩展为也支持 TimeSpan 或其他类型,但我不会感到惊讶,因为 JSON.NET 的可扩展性非常好。

关于c# - 如何解析 Newtonsoft JSON 中的 TimeSpan 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com