【问题标题】:Parsing JSON DateTime from Newtonsoft's JSON Serializer从 Newtonsoft 的 JSON 序列化器解析 JSON 日期时间
【发布时间】:2010-10-14 16:28:17
【问题描述】:

我已经使用 Newtonsoft 的 JSON 序列化器序列化了一个对象,并且 DateTime 已经通过:

/Date(1237588418563+0000)/

当我对其进行 $.evalJSON() 时,它是一个对象,但我在其上找不到任何正常的 Date 方法,例如 toUTCString。

任何想法我可以用这个做什么?

【问题讨论】:

标签: json datetime parsing json.net


【解决方案1】:
ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

这对我有用

【讨论】:

  • ObjectMapper 到底是什么?
【解决方案2】:

遇到了同样的问题,并根据 Adam 的链接找到了解决方案:

new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));

它看起来像一个 Unix 时间戳,javascript 可以很容易地将其转换为日期对象。 - 0 只是让 javascript 将 substr 输出视为整数......我想你也可以 Number() 它,如果你不喜欢 - 0 的外观

【讨论】:

    【解决方案3】:

    对不起,我简化了一点@James Newton-King

    string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);    
    

    【讨论】:

      【解决方案4】:

      JSON 对象包含如下内容:

      var data = {"CreatedDate":"/Date(1327572000000-1000)/"});
      
       ///
      var oddDateTimeZone = data.CreatedDate;
      var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13);
      var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4);
      var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone)));
      

      但是,最好还是修复 JSON 对象,以便在不使用类似 eval() 或 window[] 的情况下触发日期函数。也许在 jQuery 中。不确定。

      不要忘记偏移量可以是+,而不仅仅是-

      【讨论】:

      • 您还使用正则表达式,然后像这样评估文本:eval("new " + data.CreateDate.replace(/\//ig,"")) 似乎工作得很好
      【解决方案5】:

      我想出了一种可能对某些人有用的不同方法。基本上我创建了我自己的 CustomDateConverter ,我会在需要时调用它。转换器采用 2 个参数,例如日期格式yyyy-MM-dd HH:mm:ss 和 TimeZoneInfo,它允许我将日期从 UTC 转换为用户的时区:

      public class JSONCustomDateConverter : DateTimeConverterBase
      {
          private TimeZoneInfo _timeZoneInfo;
          private string _dateFormat;
      
          public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo)
          {
              _dateFormat = dateFormat;
              _timeZoneInfo = timeZoneInfo;
          }
          public override bool CanConvert(Type objectType)
          {
              return objectType == typeof(DateTime);
          }
      
          public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
          {
              throw new NotImplementedException();
          }
      
          public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
          {
              writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat));
              writer.Flush();
          }
      

      你可以这样使用它:

       var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });
      

      如果您只想要自定义日期格式,显然您可以删除任何与时区相关的内容。让我知道这有帮助!

      【讨论】:

      • 如果有人希望通过在 Asp.Net MVC 上全局注册来扩展它。services.AddMvc() .AddJsonOptions(jsonOption =&gt; { jsonOption.SerializerSettings.Converters.Add( new JSONCustomDateConverter("dd/mm/yyy", TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"))); });
      【解决方案6】:

      使用 Json.NET 附带的其中一个 JsonConverter 来处理日期以获得更好的格式。 JavaScriptDateTimeConverter 会自动给你一个 JavaScript 日期。

      public class LogEntry    
      {    
        public string Details { get; set; }    
        public DateTime LogDate { get; set; }
      }
      
      [Test]
      public void WriteJsonDates()
      {    
        LogEntry entry = new LogEntry    
        {    
          LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),    
          Details = "Application started."    
        };    
      
      
        string defaultJson = JsonConvert.SerializeObject(entry);    
        // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}     
      
        string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());    
        // {"Details":"Application started.","LogDate":new Date(1234656000000)}
      
        string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());    
        // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}    
      }
      

      文档:Serializing Dates in JSON with Json.NET

      【讨论】:

      • 作为参考,IsoDateTimeConverter 上的命名空间是 Newtonsoft.Json.Converters,而 JsonConvert.SerializeObject 上的命名空间是 Newtonsoft.Json
      【解决方案7】:

      从 Newtonsoft Json.Net 4.5r5 版开始,您使用 JsonPropertyAttribute Class 类并设置其 ItemConverterType Property 属性。 用法:

      // class to be serialized
      public class MyClass
      {
          [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
          public DateTime? DateTime1;
          public DateTime? DateTime2;
      }
      

      正如我所观察到的,这将为此类中的所有属性设置 DateTimeConverter,而不仅仅是之前声明的属性。

      【讨论】:

      • 这个答案是最新的
      • 我不认为我理解它应该做什么,或者它应该如何工作。在我的课上,我有这个: [JsonProperty(ItemConverterType = typeof(IsoDateTimeConverter))] public System.DateTime RecordInsertedDate { get;放;但是我的日期仍然是默认的 /Date(132456560000000)/ 格式
      • NVM,我使用的是覆盖它的 ServiceStack。您必须使用 ServiceStack 的 JsConfig.DateHandler = DateHandler.ISO8601;在您的代码中配置设置以获取 ISO8601
      猜你喜欢
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多