Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何设置Json.Net序列化程序以自定义方式运行?_C#_Datetime_Asp.net Web Api_Json.net_Locale - Fatal编程技术网

C# 如何设置Json.Net序列化程序以自定义方式运行?

C# 如何设置Json.Net序列化程序以自定义方式运行?,c#,datetime,asp.net-web-api,json.net,locale,C#,Datetime,Asp.net Web Api,Json.net,Locale,当我序列化时,我的所有日期都将作为本地时间,以便保存 与读/写同一数据库或执行服务器到服务器集成的遗留应用程序的向后兼容性。 但我想为我的消费者生成UTC(ISO格式)字符串,因为他们可以在我的国家的任何地方。 因为我住在巴西,这个国家有不止一个时区,所以我不得不处理这个混乱的地区 在反序列化时,由于向后兼容性,我希望将utc格式的字符串转换为本地格式 巴西(巴西时间)在-03:00偏移,然后: 当web api使用者输入:“…T18:00:00.000Z”时,在web api端,DateTim

当我序列化时,我的所有日期都将作为本地时间,以便保存 与读/写同一数据库或执行服务器到服务器集成的遗留应用程序的向后兼容性。 但我想为我的消费者生成UTC(ISO格式)字符串,因为他们可以在我的国家的任何地方。 因为我住在巴西,这个国家有不止一个时区,所以我不得不处理这个混乱的地区

在反序列化时,由于向后兼容性,我希望将utc格式的字符串转换为本地格式

巴西(巴西时间)在-03:00偏移,然后:

当web api使用者输入:“…T18:00:00.000Z”时,在web api端,
DateTime
time需要变成本地格式的“15:00:00”

当web api输出非常相同的“15:00:00”
DateTime
时,序列化程序应将该时间转换回utc格式的“…T18:00:00.000Z”

如果可能的话,我想要一个应用程序范围的解决方案,我不想用自定义JsonConverter装饰每个类或属性


你能给我一些建议吗?

你描述的是
DateTimeZoneHandling.Local
的行为,至少在7.0.1版本中是这样,这是回答这个问题时的最新版本

实际上有一个细微的区别:
DateTime
序列化后,
jsonvert
er将以偏移格式[
15:00-03:00
]而不是UTF格式[
18:00Z
]生成时间。我相信这是意料之中的(至少对我来说是有意义的),因为SerializerSettings中的格式是
DateTimeZoneHandling.Local
,如果是
DateTimeZoneHandling.Utc
,它将产生
18:00Z
,这是意料之中的

反序列化日期时间时,UTC格式的值(如
“2015-01-01T18:00:00.000Z”
)将正确地变为与新日期时间(2015,1,1,15,0,0,DateTimeKind.Local)相同的值

要配置
jsoninvert
请在
WebApiConfig
Register()
方法中添加以下代码:

using Newtonsoft.Json;
...
public static void Register(HttpConfiguration config)
{
    var settings = config.Formatters.JSonFormatter.SerializerSettings;
    settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
    settings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
}

免责声明:测试结果来自-03:00偏移量。(巴西利亚时间)

将您自己的转换器添加到JsonSerializer的转换器列表中。@Brannon,我想我不再需要这个了,DateTimeZoneHandling。本地的就行了。我用的是旧版本。我是否应该添加一个答案以供将来参考?还是这个问题太本地化了?@Brannon在最新版本7.0.1中,DateTimeZoneHandling.Local正确读取本地日期中的18:00Z到15:00,并在序列化时正确生成15:00到15:00-03:00。它是偏移量格式,但适用于我的case@EProgrammerNotFound:是的,请写下您的解决方案,作为其他有同样问题的人的答案。@EProgrammerNotFound:我只想添加一行内容,说明如何配置
JsonConvert
以使用
DateTimeZoneHandling.Local
。否则看起来不错。