使用 JSON.NET 反序列化 Noda Time 的 LocalDateTime

2024-02-09

我正在尝试使用 Json.NET 序列化一些 Noda Time 值,但遇到了麻烦。序列化很简单:

LocalDateTime dt = ... // Assigned elsewhere
LocalDateTimePattern isoDateTimePattern = LocalDateTimePattern.GeneralIsoPattern;
JObject root = new JObject();
root.Add("time", isoDateTimePattern.Format(dt));

// Serialize other elements

using (var sw = new StreamWriter(stream)) {
    serializer.Serialize(sw, root);
}

但反序列化是有问题的。 Json.NET 似乎可以识别上面的 ISO 格式的日期和时间 并自动将其转换为 DateTime 对象,这不是我想要的。

using (var sr = new StreamReader(stream)) {
        using (var jr = new JsonTextReader(sr)) {
            var root = serializer.Deserialize<JObject>(jr);

            // Deserialize other elements

            var time = root.GetValue("time"); // time.Type is JTokenType.Date
            string timeStr = time.Value<string>(); // Is "01/10/2014 10:37:32"

            // Kaboom. String is not in the right format (see above comment)
            var parsedTime = isoDateTimePattern.Parse(time.Value<string>());
        }
}

从事实来看timeStr显示为美国格式的日期和时间,我猜time.Value<string>()只是打电话ToString关于一些内部的DateTimeJson.NET 已解析的对象。 我可以做类似的事情

var cdt = time.Value<DateTime>();
LocalDateTime ldt = new LocalDateTime(cdt.Year, cdt.Month, cdt.Day, cdt.Hour, cdt.Minute);

但这很复杂,意味着 Json.NET 正在执行不需要的转换。

有没有办法只获取 JSON 值的原始字符串值?


有一个NodaTime.Serialization.JsonNet 包 https://www.nuget.org/packages/NodaTime.Serialization.JsonNetNuGet 上提供的似乎正是针对这种情况。设置方法如下:

下载并安装解决方案中的包后,添加以下内容using对您的代码的声明:

using NodaTime.Serialization.JsonNet;

像这样设置你的序列化器:

JsonSerializer serializer = new JsonSerializer();
serializer.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);

然后,当你反序列化时,你可以得到一个LocalDateTime来自JObject using ToObject<LocalDateTime>(serializer)像这样:

using (var sr = new StreamReader(stream))
{
    using (var jr = new JsonTextReader(sr))
    {
        var root = serializer.Deserialize<JObject>(jr);

        // Deserialize other elements

        var time = root.GetValue("time");
        var parsedTime = time.ToObject<LocalDateTime>(serializer);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JSON.NET 反序列化 Noda Time 的 LocalDateTime 的相关文章

随机推荐

  • 更改默认图标工具栏(传单)

    我如何将默认工具栏图标更改为传单上的其他图标 上面的图片显示了图标的默认视图 我想自定义图标并将其更改为其他图标 例如我希望第一个图标看起来像桥梁和第二个文本图标等等 我已经尝试了几种方法但没有成功 这是我的代码 var electricp
  • 在 lapply 函数中访问和保留列表名称

    我需要访问 lapply 函数内的列表名称 我在网上找到了一些线程 据说我应该迭代列表的名称 以便能够获取函数中的每个列表元素名称 gt n names mylist gt mynewlist lapply n function namei
  • 在另一个视图控制器中更改标签的文本

    我有一个名为 FirstViewController 的视图控制器 还有一个名为 SecondViewController 的视图控制器 我提出第二个视图控制器 UIViewController controller self storyb
  • 在 C 中声明和修改字符串

    我最近开始尝试学习C语言 在我的第一个程序 简单的 hello world 事情 中 在我意识到我不能这样做之后 我遇到了声明字符串的不同方法variable name string data char variable name data
  • Solr 和 MySQL,如何保持更新的索引,以及,如果很简单,是否还需要数据库?

    我是 Solr 的初学者 所以请耐心等待 在我当前的项目中 我有一个非常简单的数据库 只有 1 个表 其中包含 4 个字段 id name subject msg 据我了解 每次添加 或删除 新记录时 我都需要将该记录添加到索引中 本质上执
  • 如何计算具有三角形面的网格的质心?

    我想根据以下描述计算网格的新质心 但我不想使用 Blender 的内置函数来计算质心 如所解释的here https blender stackexchange com questions 14294 how to recenter an
  • 如何保存pip包

    我们有一个基于 python django 的 Web 应用程序 其中许多组件都是使用 pip 安装的 所以我想问是否有一种方法可以保存或下载并保存我们正在 pip install 的特定 python 包 例如 pip install d
  • 将 md5 哈希字节数组转换为字符串

    如何将哈希结果 字节数组 转换为字符串 byte bytePassword Encoding UTF8 GetBytes password using MD5 md5 MD5 Create byte byteHashedPassword m
  • 在Java中像表格一样打印二维数组[重复]

    这个问题在这里已经有答案了 我想像表格一样打印输入的二维数组 也就是说 如果出于某种原因他们全都输入 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 就像上面一样 但在 Java Eclipse 的控制台中 没有花哨的按
  • “404 重定向”是合法的重定向吗?

    我遇到的情况是 某些用户可能会通过链接等进入错误输入的页面 在大多数情况下 我可以确定应显示的正确页面 因此我想重定向到正确的 URL 301 重定向适合这种情况吗 301 的意思是 永久移动 但在这种情况下 该文档一开始就不存在 设置 4
  • 实体框架核心:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“关系”中插入标识列的显式值

    我正在构建一个应用程序 当我想将表单插入表单表时 出现以下错误 无法在表 关系 中插入标识列的显式值 当 IDENTITY INSERT 设置为 OFF 时 这些是我的模型 表格型号 DatabaseGenerated DatabaseGe
  • 如何向 OpenDayLight Karaf 添加新功能?

    如何将新功能添加到 ODL Oxygen SR3 0 8 3 作为 Karaf 模块 例如 我从以下位置下载了预构建的 ODL 官方网站 https nexus opendaylight org content repositories p
  • 是否可以反转具有恒定额外空间的数组?

    假设我有一个数组A with n系列中的独特元素 0 n 换句话说 我有整数 0 n 的排列 是否可以转型A into B使用 O 1 额外空间 又名就地 这样B A i 我 例如 A B 3 1 0 2 4 gt 2 1 3 0 4 是的
  • PhoneGap 是慢还是有 bug?

    在我编译演示应用程序并将其部署到我的 Samsung Galaxy S II 后 我注意到 PhoneGap 附带的示例 PhoneGap 应用程序在按下按钮和滚动时响应不太灵敏 我还使用 PhoneGap 和 jQuery Mobile
  • 开源 ETL 框架 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在第一个空格出现处分割字符串

    我没有得到一个优化的正则表达式 它将我的字符串拆分为第一个空白出现的位置 var str 72 tocirah sneab 我需要得到 72 tocirah sneab 如果您只关心空格字符 而不是制表符或其他空白字符 并且只关心第一个空格
  • 在Using语句中从DataLayer返回DataReader

    我们有很多数据层代码都遵循这个非常通用的模式 public DataTable GetSomeData string filter string sql SELECT FROM SomeTable WHERE SomeColumn Filt
  • 声明字符串 public static readonly 与 public const 与 public static const

    在每个项目中 我们都有一个文件用于存储该项目中使用的各种 SQL 语句 类的声明方式和字符串的声明方式有一些变化 类声明示例 internal sealed class ClassName internal static class Cla
  • 在RESTLET中读取Web-INF中的配置文件

    我正在尝试读取放置在 WEB INF 根路径内的配置文件 该应用程序使用RESTLET框架 我在官方RESTLET上读到doc http restlet com technical resources restlet framework j
  • 使用 JSON.NET 反序列化 Noda Time 的 LocalDateTime

    我正在尝试使用 Json NET 序列化一些 Noda Time 值 但遇到了麻烦 序列化很简单 LocalDateTime dt Assigned elsewhere LocalDateTimePattern isoDateTimePat