Json.Net 在序列化时弄乱了 DateTimeOffset 的时区

2023-11-27

我看过很多相关的问题,但似乎没有一个对我有用。

我正在尝试以 UTC 格式序列化所有内容。这是我的代码:

class Class1
{
    static void Main()
    {
        Class2 foo = new Class2();
        JObject json = JObject.Parse(JsonConvert.SerializeObject(foo, new JsonSerializerSettings()
        {
            DateParseHandling = DateParseHandling.DateTimeOffset,
            DateFormatHandling = DateFormatHandling.IsoDateFormat,
            DateTimeZoneHandling = DateTimeZoneHandling.Utc
        }));

        Console.WriteLine(json.ToString());

        Console.Read();
    }
}

class Class2
{
    public DateTimeOffset time = new DateTimeOffset(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddTicks(14663484000000000));

    public DateTimeOffset time2 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddTicks(14663484000000000);

    public DateTime time3 = new DateTime(14663484000000000);
}

这是输出:

{
    "time": "2016-06-19T08:00:00-07:00",
    "time2": "2016-06-19T08:00:00-07:00",
    "time3": "0047-06-20T15:00:00Z"
}

这是我试图获得的输出:

{
    "time": "2016-06-19T15:00:00+00:00",
    "time2": "2016-06-19T15:00:00+00:00",
    "time3": "0047-06-20T15:00:00+00:00"
}

如您所见,DateTimeOffset属性根本没有转换。这DateTime是,但时区是用Z而我正在尝试使用+00:00.


在您的代码中,您正在执行以下操作:

  1. 序列化一个实例Class2使用特定的 JSON 字符串DateTime- 相关的序列化设置。
  2. 反序列化为JToken等级制度不使用这些设置.
  3. (对层次结构进行其他修改 - 未显示。)
  4. 序列化JToken层次结构到最终字符串(通过json.ToString())再次不使用这些设置。

当您这样做时,步骤 #1 中选择的日期的格式设置将丢失。

为了解决这个问题,您需要在每次从 JSON 字符串表示形式序列化或序列化到 JSON 字符串表示形式时应用这些设置,因为,如中所述本文档页面, JSON 没有“官方”日期格式。因此,每当 Json.NET 与 JSON 字符串表示形式进行转换时,它都会应用启发式方法来识别和格式化日期 - 您不是一次而是三次执行此操作。

您可以通过执行以下操作来实现此目的:

var settings = new JsonSerializerSettings()
{
    DateParseHandling = DateParseHandling.DateTimeOffset,
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};

// Generate initial serialization
var initialString = JsonConvert.SerializeObject(foo, settings);

// Parse back to JToken
var json = JsonConvert.DeserializeObject<JObject>(initialString, settings);

// Make modifications as required
// json["foo"] = "bar";

// Generate final JSON.
var finalString = JsonConvert.SerializeObject(json, Formatting.Indented, settings);

为了提高效率,你可以使用JToken.FromObject() (or JObject.FromObject()如果您愿意)生成JToken层次结构,无需创建和解析初始字符串表示形式:

var settings = new JsonSerializerSettings()
{
    DateParseHandling = DateParseHandling.DateTimeOffset,
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};

var json = JToken.FromObject(foo, JsonSerializer.CreateDefault(settings));

// Make modifications as required
// json["foo"] = "bar";

// Generate final JSON.
var finalString = JsonConvert.SerializeObject(json, Formatting.Indented, settings);

但请注意,Json.NET 将输出 UTCDateTime在格式中"0047-06-20T15:00:00Z"而不是"2016-06-19T15:00:00+00:00"原因已解释here。如果您需要 UTCDateTime要序列化的属性DateTimeOffset您可能需要使用的格式定制转换器.

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

Json.Net 在序列化时弄乱了 DateTimeOffset 的时区 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 两个日期之间间隔 15 分钟 javascript

    问题 我需要将两个日期 时间戳之间的所有 15 分钟时隙 日期格式 2016 08 10 16 00 00 创建为 HH mm 格式的数组 其中分钟限制为 00 15 30 45 示例 中午 12 30 到下午 2 30 将 gt 12 3
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐

  • 将旋转变换设置为 UIView 或其图层似乎不起作用?

    我试图在我的屏幕中拥有一个子视图 由一个视图控制器拥有 not当设备旋转时旋转 我的视图控制器允许按其应有的方式进行旋转 并且我尝试将 90 度旋转应用于一个 静止 视图以抵消整体旋转 问题是 无论如何 一切似乎都在旋转 而变换似乎没有做任
  • 将字节数组从 Oracle RAW 转换为 System.Guid?

    我的应用程序使用使用 DataReaders 在 ADO NET 中编写的自定义数据访问层与 Oracle 和 SQL Server 数据库进行交互 现在 我在 GUID 我们用作主键 和 Oracle RAW 数据类型之间的转换时遇到问题
  • firebase 部署时出现 NPM 错误 --only 函数的原因是什么

    我最近在尝试部署我的 firebase 功能时收到此错误 但是 自上次成功部署以来我没有更改任何依赖项 functions all necessary APIs are enabled i functions preparing funct
  • AutoFixture CompositeDataAttribute 不适用于 PropertyDataAttribute

    我正在尝试创建AutoPropertyDataAttribute基于CompositeDataAttribute从这个例子AutoFixture PropertyData 和异构参数 它适用于单组参数 但适用于更多组参数 这是代码 publ
  • 在 foreach 循环声明中使用 LINQ

    直接在 foreach 循环声明中声明 LINQ 是一种不好的做法吗 在表现或微妙的行为差异方面 例如 foreach string name in persons Select x gt x name Do something with
  • 获取 OSX 连接的 Wi-Fi 网络名称

    我需要获取 OSX 上当前连接的 Wi Fi SSID 的名称 我搞乱了 SystemConfiguration 框架 我觉得它就在那里 因为我能够获取网络位置的名称 但我并没有真正找到获取 Wi Fi SSID 的方法 将不胜感激任何帮助
  • rvm安装:ruby安装错误

    我想在我的 Linux Mint 12 上安装 ruby 我正在关注本教程 and this one 当我跑步时rvm install 1 9 3我看到这个错误 Installing Ruby from source to usr shar
  • 如何在 Swift 中解码 HTML 实体?

    我正在从网站提取 JSON 文件 收到的字符串之一是 The Weeknd 8216 King Of The Fall 8217 Video Premiere TheWeeknd SoPhi 我怎样才能转换类似的东西 8216变成正确的字符
  • 如何在 Java 中迭代字符串?

    public static Boolean cmprStr String s1 String s2 STUFF 我想迭代 s1 以确保 s1 中的每个字符都包含在 s2 中 public static Boolean cmprStr Str
  • django-allauth 将用户名设置为与电子邮件相同

    我有一个注册表单 只要求提供电子邮件和密码 当用户注册时 django allauth 通过从用户的电子邮件地址中去除 email 后缀来为该用户创建一个用户名 例如 如果用户使用 电子邮件受保护 他的用户名是 某些用户 并且如果另一个用户
  • ggplot 单个条上的透明度

    我目前正在尝试使用 ggplot 创建一个条形图 其中单个条形部分透明 我有以下代码 dt1 lt data table yr c 2010 2010 2011 2011 val c 1500 3000 2000 1100 x c a b
  • 指向数组第一个元素之前的指针

    在 C 语言中据说当指针引用同一个数组或超出该数组末尾的一个元素时 算术和比较就得到了明确的定义 那么数组第一个元素之前的一个呢 只要我不取消引用它就可以吗 Given int a 10 p p a 1 这样写是否合法 p 2 这样写是否合
  • 禁用菜单按钮?

    我有一个自定义菜单选项 如果单击屏幕上的按钮 我想禁止它弹出 我想过使用这段代码 但它不起作用 Override public boolean onPrepareOptionsMenu Menu menu if Schedule menu
  • 页面刷新再次触发该事件

    在asp net中 当我提交表单并刷新它时 数据再次重新提交 C 有没有办法在页面加载时捕获页面刷新事件 ASP NET 没有提供直接执行此操作的方法 另一方面 有一些技巧可以避免重复提交 提交后重定向 这是最糟糕的 即使它避免了重复提交
  • C++:指针向量在push_back()之后失去引用

    在我的代码中 有一个 Node 对象的全局向量和一个 Node 指针的本地向量 include
  • 使 TabControl 标头在 WPF 中可滚动

    正如标题中提到的 我想将 TabControl 的标题更改为可滚动 原因 我有太多 tabItems 并且换行对于我来说不是最好的解决方案 所以我想将其更改为 类似的东西 由箭头指示的滚动条 谁能帮助我并展示如何做到这一点 我使用的是wpf
  • 使用 VS2010 的混合 C# C(win32) 项目中没有加载任何符号

    我的项目有几个新的 C 模块和一个使用 win32 系统调用编译的 C 模块 不是 C 我使用 PInvoke 互操作层从 C 调用 C 代码 C 函数正在被调用 所有模块都写入单个 bin 目录并写入 pdb 文件 在运行时 然后在调用
  • 如果启动的进程打开,则应用程序退出后套接字不会关闭

    我的 C net 应用程序当前执行以下操作 除其他外 创建一个线程 在特定端口上打开套接字并等待指令 消息传入 套接字线程读取消息并引发事件 事件处理程序调用必要的函数来解析消息并执行必要的操作 例如启动应用程序 指定的外部 应用程序 异步
  • OpenHTMLToPDF:将自定义字体嵌入到由 HTML 创建的 PDF 中

    我使用 Jsoup 从 HTML 创建 PDF 并打开HTML转PDF 我必须在 PDF 中使用不同的字体来覆盖非拉丁字形 请参阅here 如何正确嵌入我的字体 重现问题的简化程序 src main resources test html
  • Json.Net 在序列化时弄乱了 DateTimeOffset 的时区

    我看过很多相关的问题 但似乎没有一个对我有用 我正在尝试以 UTC 格式序列化所有内容 这是我的代码 class Class1 static void Main Class2 foo new Class2 JObject json JObj