当前位置: 首页 > 知识库问答 >
问题:

强制JSON. NET在序列化DateTime时包含毫秒(即使ms组件为零)

陶高峯
2023-03-14

我使用JSON. NET直接从对象实例序列化DateTime值(不使用DateTime。带格式化器的ToString())。

有没有办法强制使用JSON。NET在序列化中包含毫秒,即使DateTime的毫秒组件为零?

背景:对于这个JSONendpoint,我有一个非常慢的web服务使用者。条件逻辑对于消费者来说是昂贵的,所以我希望每次都提供相同的数据格式。

共有3个答案

顾恺
2023-03-14

我在使用JsonWriter时遇到了这个问题,需要解决它,因为我们观察到Javascript日期库,例如Day。js希望毫秒有3位数字。这个问题让我想到了这个解决方案,所以我想分享一下,以防其他人有像我这样的用例:

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter writer = new JsonTextWriter(sw)) {
    writer.Formatting = Newtonsoft.Json.Formatting.None;
    writer.DateFormatString="yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff''";
    writer.WriteStartObject();

    DateTime? date = new DateTime(2021,12,30,23,59,40,250);
    writer.WritePropertyName("Date1");
    writer.WriteValue(date);

    date = new DateTime(2021, 12, 30, 23, 59, 40, 555);
    writer.WritePropertyName("Date2");
    writer.WriteValue(date);

    date = new DateTime(2021, 12, 30, 23, 59, 40, 0);
    writer.WritePropertyName("Date3");
    writer.WriteValue(date);

    date = null;
    writer.WritePropertyName("DateNULL");
    writer.WriteValue(date);
    writer.WriteEndObject();
}
Console.WriteLine(sb.ToString());

这就产生了:

{
    "Date1": "2021-12-30T23:59:40.250",
    "Date2": "2021-12-30T23:59:40.555",
    "Date3": "2021-12-30T23:59:40.000",
    "DateNULL": null
}

我需要补充的重要一行是:

writer.DateFormatString="yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff''";
宰父德馨
2023-03-14

对于任何一个找到这个答案并想要解析这些答案的Java人来说。NET默认格式的时间戳,我想说明一种用于解析格式的Java 8(Java.time.)方法:

public static final DateTimeFormatter FORMATTER =
    new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss")
                                  .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
                                  .toFormatter();
...
LocalDateTime ldt = LocalDateTime.parse(dateString, FORMATTER);

这表示预期0-3位小数毫秒,预期小数点为true。它正确地将“.47”解释为470毫秒。

索正豪
2023-03-14

在我目前的项目中,我们遇到了同样的问题。我们使用Web API(以及JSON. Net)来实现REST API。我们发现,当序列化DateTime对象时,JSON. Net从毫秒中省略尾随的零,或者如果日期为零,则完全省略日期的毫秒。我们的客户期望一个固定长度的日期时间字符串,毫秒正好有3位数。我们通过在Application_Start()中执行以下操作来修复它:

JsonSerializerSettings settings = HttpConfiguration.Formatters.JsonFormatter.SerializerSettings;
IsoDateTimeConverter dateConverter = new IsoDateTimeConverter 
{ 
    DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" 
};
settings.Converters.Add(dateConverter);

如果您不使用Web API,可以通过创建JsonSerializerSettings的新实例,向其中添加IsoDateTimeConverter,然后将序列化程序设置传递给JsonConvert,来完成同样的任务。序列化对象()

注意:如果您正在序列化一个DateTimeOffset或一个本地的DateTime,并且您想要包含时区偏移,请将上面格式中引用的'Z'替换为未引用的K。有关详细信息,请参阅留档中的自定义日期和时间格式字符串。

 类似资料:
  • 我反映了JSON.NET JavaScriptDateTimeConverter类代码,复制了它,并将该类重命名为3DateTimeConverter,以便修改它以更精确和强类型的庄园格式化DateTime对象。 我让它根据JSON.NET输出强类型对象的方式输出一个类型,如: 运行JsonConverter的重写WriteJson方法来生成该值。 但是,当我尝试使用与相同转换器完全相同的设置反序

  • 问题内容: 我正在使用JSON.Net作为c#和Razor视图引擎中的大型MVC 3 Web应用程序的序列化器。对于一个视图中的初始页面加载,在脚本标记中使用倾倒了大量JSON 。 问题在于某些对象的某些值包含撇号(例如O’Brien之类的名称),JSON.Net不会以任何方式转义或编码。 不能对存储在数据库中的值进行预编码,因为这会使其他各种过程变得非常复杂。 有没有一种方法可以强制JSON.N

  • 问题内容: 是否可以使用Json.NET 序列化为NDJSON(换行分隔的JSON)?Elasticsearch API使用NDJSON进行批量操作,我找不到任何暗示 任何 .NET库都支持此格式的信息。 这个答案提供指导反序列化NDJSON,并有人指出,一个能够独立序列每一行和新行加入,但我不一定会调用 支持 。 问题答案: false`](http://www.newtonsoft.com/j

  • 我使用的是 Jackson 2.8,需要与不允许在 ISO 8601 时间戳内毫秒的 API 进行通信。 预期格式为:“ 我正在使用杰克逊的JavaTimeModule,设置为。 但这会打印毫秒。 所以我尝试使用,这没有改变任何东西。 我目前的解决方法是这样的: 我正在重写<code>Instant的默认序列化程序。类</code>。 有没有什么好的方法使用一些配置参数来解决这个问题?

  • Jackson序列化java.time。默认情况下,即时,将日期时间戳写入为纳秒。 它产生这样的 我想知道是否有办法去掉最后的零。我想要这样的东西: 我试过: 但是这个配置将其更改为毫秒表示。我想要秒部分和小数毫秒部分。

  • 下面是一个演示这个问题的小提琴:https://dotnetfiddle.net/yi47ey 问题是,我们的客户机正在崩溃,因为他们期望一致的格式(例如,总是返回毫秒,即使在) 我找到了这个引用:https://www.w3.org/tr/note-datetime 其中规定: 允许几分之一秒的采用标准必须同时规定最小位数(大于或等于1的数字)和最大位数(最大位数可以说是“无限制”)。 那么,这