JsonConvert.DeserializeObject到en-US文化

时间:2018-01-02 11:05:38

标签: c# json json.net

我添加了自定义JsonSerializerSettings,以确保日期始终反序列化为en-US culture

JsonConvert.DeserializeObject<T>(responseString, new JsonSerializerSettings()
                                { Culture = new System.Globalization.CultureInfo("en-US") });

但是,这对Hijri日历不起作用,日期仍然在文化日历中反序列化。

为什么呢?我在这里缺少什么?

是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; }
    -----------------
    }

Json回复 {.....,&#34; effectiveStartDate&#34;:&#34; 2018-01-02T00:00:00&#34;,....}

反序列化后

15/04/39 12:00:00

而我的预期是

2018年2月1日

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

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

答案 1 :(得分:0)

除了上面提到的ADyson之外。

取自官方source。每个想要了解更多有关DateTime

的开发人员必须阅读的文章
  

在内部,所有DateTime值都表示为刻度数   (自100纳秒间隔的数量)已经过去了   001. 1月1日午夜12:00:00实际的DateTime值是   独立于该值在a中显示时的显示方式   用户界面元素或写入文件时。一个人的外表   DateTime值是格式化操作的结果。格式化是   将值转换为字符串表示的过程。   因为日期和时间值的出现取决于此类   文化因素,国际标准,应用要求,   和个人偏好,DateTime结构提供了很多   通过重载灵活地格式化日期和时间值   其ToString方法。默认的DateTime.ToString()方法返回   使用当前值的日期和时间值的字符串表示形式   文化的短期和长期模式。以下示例使用   默认的DateTime.ToString()方法显示日期和时间   使用短期和长时间模式的美国文化,   在运行该示例的计算机上的当前文化。

DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 01/03/2008 07:00:00
  [1]: https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx