c# - Newtonsoft.Json.Linq.JObject.ToObject() 以字符串格式转换日期

标签 c# json date .net-core

我正在构建一个 .net 核心库。该错误对于 1.1 和 2.0 都是正确的。

我有一个 JObject(我读了很多其他答案,人们告诉 OP 只做 JsonConvert.Deserialize(obj),这不是一个选项,我需要拥有它)。

那个 JObject 在字符串中有一个日期,我要将它反序列化为一个对象,该对象也将它作为一个字符串,我需要将它的格式设置为与它相同的格式提供。

一个answer我看到声称一旦对象变成 JObject 日期就会被解析为该格式,但我发现情况并非如此,.ToObject() 就是这种转换的地方正在实际发生。

我在这里搜索了很多,发现了一些不适合我的可接受的解决方案。

  1. Setting DateParseHandling.None
  2. Explicitly specifying the date format.(tried the other approach in this answer as well)

这些都不起作用。

测试代码:

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace JobjectDateTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var json = @"{""Data"": {""CreatedAt"":""2018-01-04T14:48:39.7472110Z""}}";
            var thing = JsonConvert.DeserializeObject<Thing>(json);
            Console.WriteLine(thing.Data.First); // "CreatedAt": "2018-01-04T14:48:39.747211Z"

            var jsonSer = new JsonSerializer { DateFormatString = "yyyy-MM-ddTHH:mm:ssZ" };
            var innerThing = thing.Data.ToObject<InnerThing>(jsonSer);

            Console.WriteLine(innerThing.CreatedAt); // 01/04/2018 14:48:39
            Console.WriteLine(innerThing.CreatedAt == "2018-01-04T14:48:39.7472110Z"); // false

            jsonSer = new JsonSerializer { DateParseHandling = DateParseHandling.None };
            innerThing = thing.Data.ToObject<InnerThing>(jsonSer);

            Console.WriteLine(innerThing.CreatedAt); // 01/04/2018 14:48:39
            Console.WriteLine(innerThing.CreatedAt == "2018-01-04T14:48:39.7472110Z"); // false
        }

        class Thing
        {
            public JObject Data { get; set; }
        }

        class InnerThing
        {
            public string CreatedAt { get; set; }
        }
    }
}

最佳答案

您在序列化数据时一直在进行试验,但是当您开始反序列化 JSON 时,转换就发生了。这就是您需要禁用 DateParseHandling 的地方。这是您需要的更改:

var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None };
var thing = JsonConvert.DeserializeObject<Thing>(json, settings);

新输出:

"CreatedAt": "2018-01-04T14:48:39.7472110Z"
2018-01-04T14:48:39.7472110Z
True
2018-01-04T14:48:39.7472110Z
True

您可以通过这种方式查看 JObject 中的差异:

var property = (JProperty) thing.Data.First;
var value = (JValue) property.Value;
Console.WriteLine(value.Type);

在指定设置之前,打印 Date。使用阻止日期解析的设置,这将打印 String

关于c# - Newtonsoft.Json.Linq.JObject.ToObject() 以字符串格式转换日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48101340/

相关文章:

c# - 在 for 循环中创建新线程并传递参数

javascript - JS 中获取 HiddenField 的值并传入 var

c# - WPF 列表框绑定(bind)

json - 使用 HTTP cURL 将 JSON 数据与图像文件一起发布

json - Eclipse:使用 Json 编辑器插件自动格式化 JSON 文件,例如 AWS Cloudformation Template

c# - 使文本字段可见但不可编辑

php - 用 json 返回一个 blob

iphone - iOS : Date format - 20-Sep-2012

javascript - 如何检查数组中的任何日期是否在日期范围内?

r - view_zoom_manual xmin 和 xmax 使用日期 r ggplot