我正在使用WebApi 2将一些Json发送到客户端,并且它使用旧样式Date序列化而不是ISO 8601。
我看到:
"current_period_start": "/Date(1388153705)/",
"current_period_end": "/Date(1390832105)/",
"start": "/Date(1388332525)/",
我的 Global.asax.cs 看起来像这样:
GlobalConfiguration.Configure(WebApiConfig.Register);
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Converters.Add(new IsoDateTimeConverter());
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Newtonsoft.Json 默认为 IsoDateTimeConverter。因此,即使您没有指定任何内容,也应该获得正确的 ISO 格式(对我来说,您的代码也可以正常工作)。
阅读此内容或 Scott 的博客,了解有关默认值的更多信息
您很可能再次在其他地方设置转换器,也许您正在使用一些具有特定设置的自定义转换器?或者你使用的是非常旧版本的Newtonsoft.Json?
只是对@Toolkit关于格式的评论的快速评论。
您得到一个末尾没有 Z 的日期字符串的原因是,您正在解析的日期时间变量的种类为未指定。
很可能您正在分析来自具有 DateTime 属性的数据库的记录,数据库字段在保存后会丢失 Kind。
这就是为什么 json 没有在末尾添加"Z",它不知道它是 UTC 还是本地的。
您可以使用 DatetimeOffset 而不是 Datetime,如果可以更改模型而不会产生太大影响。我的选择是为 Datetime 编写一个自定义解析器,如果未指定,则强制其为 UTC。
public class CustomJsonDateConverter : DateTimeConverterBase
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var date = DateTime.Parse(reader.Value.ToString());
if (date.Kind == DateTimeKind.Unspecified)
{
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
}
return date;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var date = (DateTime)value;
if (date.Kind == DateTimeKind.Unspecified)
{
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
}
writer.WriteValue(date);
}
}
PD:我没有足够的观点来写评论,这不是主要问题的答案。