JsonConvert.DeserializeObject到en-US文化

imm*_*rza 3 c# json json.net

我添加了自定义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日

ADy*_*son 7

我认为你误解了代码是如何工作的.反序列化过程将是这样的:

  1. 创建一个T(让我们称之为x)的实例.

  2. 开始从JSON中读取属性,并在中查找匹配的属性T.将JSON属性转换为C#变量,并将它们添加到正确的属性中x.

  3. 当我们到达effectiveStartDate属性时,它会将值反序列化为DateTime对象.为了解析JSON中的字符串,它引用了en-US您提供的文化设置,以防字符串以美国格式显示日期(例如mm/dd/yyyy).但是,日期是ISO格式,它是明确的,并且可以被计算机轻松读取而不会被告知会发生什么.事实上,在这种情况下,文化背景根本不重要.

  4. 将解析的日期存储在DateTime对象中.DateTime内部不使用特定格式 - 它只是将日期存储为数字.格式仅用于将日期序列化为字符串或将其显示给人类.

反序列化现已完成,您可以在代码中自由使用常规C#对象.

x.effectiveStartDate假设您尝试在代码中的某个位置或通过调试器读取值(您没有向我们显示您正在查看日期的确切内容).不可避免地,因为您想查看它,C#将DateTime对象中存储的数字输出为人类可读的日期字符串.请注意,反序列化过程已完成,您现在回到应用程序的上下文中.因此,您可以根据ar文化及其关联的日历样式查看日期格式,因为这是您的应用程序的文化.该en-US文化仅适用于已经完成的反序列化过程.

如果要以与应用程序文化不同的格式显示日期,则需要明确告知应用程序.例如,您可以通过toString方法设置格式DateTime,和/或通过代码临时更改文化设置.