我们正在将JSON发送到由swagger定义的API,其中一些属性是DateTime,格式为yyyy-MM-
ddThh:mm:ss.000Z(毫秒数必须为3位,否则端点上的验证失败),而有些则是Date(否)时间)属性。
我已经看到很多消息说使用这样的格式化程序:
var jsonSettings = new JsonSerializerSettings();
jsonSettings.DateFormatString = "yyyy-MM-ddThh:mm:ss.000Z"; //try .fffZ too
var jsonObject= Newtonsoft.Json.JsonConvert.DeserializeObject<OurSwaggerObject>(json , setting);
但这不能将DateTimes转换为正确的格式,C#如何处理仅Date类型?它似乎总是序列化为DateTime.MinValue()
这是一个例子:
有人将json作为字符串发送给我,但是日期和日期时间以不正确的格式发送给端点。我希望swagger类和json反序列化可以格式化它们,但事实并非如此。
这是招摇的生成类
public class OurSwaggerObject
{
[Newtonsoft.Json.JsonProperty("dateTimeField", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required]
[System.ComponentModel.DataAnnotations.RegularExpression(@"^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3}Z$")]
public DateTime dateTimeField { get; set; }
[Newtonsoft.Json.JsonProperty("dateField", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required]
[System.ComponentModel.DataAnnotations.RegularExpression(@"^\d{4}-\d\d-\d\d$")]
public DateTime dateField { get; set; }
}
所以我尝试强迫json是正确的,但是我做错了或缺少了一些东西
string json = @"{ 'dateTimeField': '1995-04-07T00:00:00',
'dateField': '1995-04-07T00:00:00'
}";
/* The json we need to satisfy the swagger endpoint is:
{ 'dateTimeField': '1995-04-07T00:00:00.000Z',
'dateField': '1995-04-07'
}
*/
OurSwaggerObject deserialisedIntoObject = Newtonsoft.Json.JsonConvert.DeserializeObject<OurSwaggerObject>(json);
string serialisedToString = Newtonsoft.Json.JsonConvert.SerializeObject(deserialisedIntoObject);
//serialisedToString= "{\"dateTimeField\":\"1995-04-07T00:00:00\",\"dateField\":\"1995-04-07T00:00:00\"}"
var jsonSettings = new JsonSerializerSettings();
jsonSettings.DateFormatString = "yyyy-MM-ddThh:mm:ss.fffZ"; //this won't help much for the 'date' only field!
deserialisedIntoObject = Newtonsoft.Json.JsonConvert.DeserializeObject<OurSwaggerObject>(json,jsonSettings);
serialisedToString = Newtonsoft.Json.JsonConvert.SerializeObject(deserialisedIntoObject, jsonSettings);
//serialisedToString="{\"dateTimeField\":\"1995-04-07T00:00:00\",\"dateField\":\"1995-04-07T00:00:00\"}"
正如我在评论中提到的那样,JSON中没有标准的日期表示形式。ISO8601是 实际 标准,即大多数人几年前就开始使用此标准。ISO8601并 没有
要求毫秒。如果另一个端点需要它们,则违反了事实上的标准。
从4.5版开始,Json.NET使用IOS8601。当前的是10.0.3。以下代码:
JsonConvert.SerializeObject(DateTime.Now)
退货
"2017-09-08T19:01:55.714942+03:00"
在我的机器上。注意时区偏移量。这也是标准的一部分。Z
表示UTC。
您 可以 指定自己的时间格式,前提是正确的时间格式。在这种情况下,应该为yyyy-MM-ddTHH:mm:ss.fffZ
。请注意fff
毫秒
和 HH
24小时。
以下代码
var settings=new JsonSerializerSettings{DateFormatString ="yyyy-MM-ddTHH:mm:ss.fffZ"};
var json=JsonConvert.SerializeObject(DateTime.Now,settings);
退货
"2017-09-08T19:04:14.480Z"
格式字符串并 没有 强制时区转换。您可以通过DateTimeZoneHandling设置告诉Json.NET将时间视为Local或Utc:
var settings=new JsonSerializerSettings{
DateFormatString ="yyyy-MM-ddTH:mm:ss.fffZ",
DateTimeZoneHandling=DateTimeZoneHandling.Utc};
var json=JsonConvert.SerializeObject(DateTime.Now,settings);
返回值:
"2017-09-08T16:08:19.290Z"
更新
正如马特·约翰逊(Matt
Johnson)解释的那样,Z
它只是一个文字,而根据设置会K
生成一个Z
或一个偏移DateTimeZoneHandling
。
yyyy-MM-ddTH:mm:ss.fffK
DateTimeZoneHandling.Utc 的格式字符串:
var settings=new JsonSerializerSettings{
DateFormatString ="yyyy-MM-ddTH:mm:ss.fffK",
DateTimeZoneHandling=DateTimeZoneHandling.Utc};
var json=JsonConvert.SerializeObject(DateTime.Now,settings);
将返回 :
2017-09-11T9:10:08.293Z
更改为DateTimeZoneHandling.Utc
将返回
2017-09-11T12:15:12.862+03:00
顺便说一句,这是Json.NET 的 默认 行为,除了强制毫秒精度。
最终,.NET
尚无Date
唯一类型。DateTime用于日期和日期+时间值。您可以使用DateTime.Date属性获取DateTime的日期部分。您可以使用DateTime.Today检索当前日期。
__
一天中的时间由Timespan类型表示。您可以使用DateTime.TimeOfDay从DateTime值中提取时间。Timespan
是不
严格 ,因为它可以表示超过24小时的时间-日期类型。
那是什么 呢 ?
对显式Date,TimeOfDay的支持正在通过CoreFX
Lab项目进行。它包含“实验”功能,这些功能 极 有可能出现在.NET
Runtime中,例如UTF8支持,日期,字符串,卷轴。其中一些已经显示为单独的NuGet软件包。
通过复制代码或通过实验性的NuGet源添加它们,已经可以使用System.Time类。
问题内容: 我已经使用Newtonsoft的JSON序列化器序列化了一个对象,而DateTime的实现方式是: 当我在其上$ .evalJSON()时,它是一个对象,但在它上找不到任何正常的Date方法,例如toUTCString。 有什么办法可以解决吗? 问题答案: 使用Json.NET附带的JsonConverters之一处理日期以获得更好的格式。JavaScriptDateTimeConve
问题内容: 在我的SQL Server我有测试,其中只包含三行一个非常简单的表: ,和(,,)。 SQL中的DateTime格式类似于:。 C#中的DateTime格式类似于:。 我使用以下代码获取C#DateTime格式: 如果我尝试将其放入,则会出现错误: 日历不支持由字符串表示的DateTime。 在我的C#应用程序中,我正在尝试查找破损日期之间的总小时数。我有点想使用它了,但是它只适用
我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。 我的项目使用XML序列化将对象保存到XML文件中。在这个特殊的例子中,我有一个Item类,它有一个DateTime属性。 在某个时候,我正在初始化对象,包括像这样的DateTime属性: 我使用XMLEncoder使用辅助类序列化项目: 显然,日期时间被保存在xml中。。。但毫无价值: 显然,它没有保存任何东西,但不,它
我在一个Spring Boot应用程序中使用Java8DateTime和Jackson JSR310支持。 我禁用了SerializationFeature.write_dates_as_timestamps以强制Jackson将localDatetime序列化为字符串而不是int数组。 format,toString,json文本的打印结果 似乎toString结果应该是Jackson序列化中所
我的JSON如下: 我找到了Newtonsoft JSON。NET为C#反序列化库。我试着使用它如下: 如何访问对象以获取所有“类型”数据?我尝试了一个循环,但它不起作用,因为对象没有枚举器。
我正在使用ASP.NET MVC5框架构建一个应用程序。我需要一个函数,让我可以轻松地将ad对象转换成一个json字符串。 我找到了一个很棒的课程,它能满足我的需要。 我不确定如何解决的唯一问题是datetime值。 从数据库中读取了一个包含一些datetime列的列表后,我想将该列表转换为JSON。当我使用jsonHelper.toJson(mylist)时;datetime字段如下所示 如何将