我添加了自定义JsonSerializerSettings以确保日期始终反序列化en-US culture.
JsonConvert.DeserializeObject<T>(responseString, new JsonSerializerSettings()
{ Culture = new System.Globalization.CultureInfo("en-US") });
Run Code Online (Sandbox Code Playgroud)
但是,这对于Hijri日历不起作用,并且日期仍然在ar culture日历中反序列化.
为什么?我在这里错过了什么?
是T
public partial class T
{
--------------------
public Nullable<System.DateTime> EffectiveStartDate { get; set; }
public Nullable<System.DateTime> EffectiveEndDate { get; set; }
public Nullable<System.DateTime> SourceDate { get; set; }
-----------------
}
Run Code Online (Sandbox Code Playgroud)
Json回应 {.....,"effectiveStartDate":"2018-01-02T00:00:00",....}
反序列化后
15/04/39 12:00:00
而我的期望是
2018年2月1日
我认为你误解了代码是如何工作的.反序列化过程将是这样的:
创建一个T(让我们称之为x)的实例.
开始从JSON中读取属性,并在中查找匹配的属性T.将JSON属性转换为C#变量,并将它们添加到正确的属性中x.
当我们到达effectiveStartDate属性时,它会将值反序列化为DateTime对象.为了解析JSON中的字符串,它引用了en-US您提供的文化设置,以防字符串以美国格式显示日期(例如mm/dd/yyyy).但是,日期是ISO格式,它是明确的,并且可以被计算机轻松读取而不会被告知会发生什么.事实上,在这种情况下,文化背景根本不重要.
将解析的日期存储在DateTime对象中.DateTime内部不使用特定格式 - 它只是将日期存储为数字.格式仅用于将日期序列化为字符串或将其显示给人类.
反序列化现已完成,您可以在代码中自由使用常规C#对象.
x.effectiveStartDate假设您尝试在代码中的某个位置或通过调试器读取值(您没有向我们显示您正在查看日期的确切内容).不可避免地,因为您想查看它,C#将DateTime对象中存储的数字输出为人类可读的日期字符串.请注意,反序列化过程已完成,您现在回到应用程序的上下文中.因此,您可以根据ar文化及其关联的日历样式查看日期格式,因为这是您的应用程序的文化.该en-US文化仅适用于已经完成的反序列化过程.
如果要以与应用程序文化不同的格式显示日期,则需要明确告知应用程序.例如,您可以通过toString方法设置格式DateTime,和/或通过代码临时更改文化设置.
| 归档时间: |
|
| 查看次数: |
1857 次 |
| 最近记录: |