【问题标题】:JsonConvert.DeserializeObject with two types of datetime format具有两种日期时间格式的 JsonConvert.DeserializeObject
【发布时间】:2017-12-21 19:44:30
【问题描述】:

我需要同时期待:dd/MM/yyyydd/MM/yyyy HH:mm:ss

var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy HH:mm:ss" };
var resultado = JsonConvert.DeserializeObject<MyObject>(json, dateTimeConverter);

使用此代码,我收到以下错误消息:

System.FormatException: '字符串未被识别为有效的 DateTime。'

【问题讨论】:

  • 如果 JSON 具有这些格式,则它不是有效的 JSON,因此反序列化器不需要识别它们。最好是编写这些的系统应该是固定的,否则您必须为这些字段编写自己的反序列化代码。
  • @SamiKuhmonen json 规范没有定义日期格式,所以不能说它的 json 无效。
  • @Evk 我会被诅咒并得到纠正。他们应该虽然:P
  • @Evk 是正确的,但请注意,在任何公共 API 中,de facto 标准都是 ISO8601 (yyyy-MM-ddTHH:mm:ssZ)。但是,以其他特定于语言环境的格式传递它是完全合理的,特别是如果该字段旨在直接在客户端应用程序中呈现。 (只是不在 API 中)。 ;)

标签: c# .net datetime json.net


【解决方案1】:

您根本不需要指定任何转换器。默认情况下,这两种格式都可以使用。

class Foo
{
    public DateTime DateTime { get; set; }
}

// This Just Works.

string json1 = "{ \"DateTime\" : \"12/31/2017\" }";
string json2 = "{ \"DateTime\" : \"12/31/2017 23:59:59\" }";

var o1 = JsonConvert.DeserializeObject<Foo>(json1);
var o2 = JsonConvert.DeserializeObject<Foo>(json2);

【讨论】:

  • 是的。我刚刚设置了我的 CultureInfo,两种格式都可以。谢谢。
  • 我定义了一个愚蠢的“日期”类型。更改为“日期时间”修复了它。
【解决方案2】:

您可以编写自己的 JsonConverter:

class DataObject
{
    public DateTime CreatedDate { get; set; }
}

class CustomJsonConverter : JsonConverter
{
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var obj = new DataObject();

            reader.Read();
            var prop = obj.GetType().GetProperty("CreatedDate");

            reader.Read();
            var strDate = (string)reader.Value;
            DateTime date;
            if (DateTime.TryParseExact(strDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
                prop.SetValue(obj, date);
            if (DateTime.TryParseExact(strDate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
                prop.SetValue(obj, date);

            return obj;
        }
}

【讨论】:

    【解决方案3】:

    也许你可以像这样子类化 IsoDateTimeConverter:

    class Format1 : IsoDateTimeConverter
    {
        public Format1()
        {
            DateTimeFormat = @"dd/MM/yyyy";
        }
    }
    
    class Format2 : IsoDateTimeConverter
    {
        public Format2()
        {
            DateTimeFormat = @"dd/MM/yyyy HH:mm:ss";
        }
    }
    

    然后您只需将 JsonConverter 属性添加到您的模型中,如下所示:

    class Entity
    {
        [JsonConverter(typeof(Format1))]
        public DateTime Date1 { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2022-09-27
      相关资源
      最近更新 更多