175

我正在开发一个 API 来使用 ASP.NET Web API 公开一些数据。

在其中一个 API 中,客户端希望我们以yyyy-MM-dd格式公开日期。我不想为此更改全局设置(例如GlobalConfiguration.Configuration.Formatters.JsonFormatter),因为它非常特定于该客户端。我确实在为多个客户开发一个解决方案。

我能想到的解决方案之一是创建一个自定义JsonConverter,然后将其放入我需要进行自定义格式设置的属性中

例如

class ReturnObjectA 
{
    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime ReturnDate { get;set;}
}

只是想知道是否有其他简单的方法可以做到这一点。

4

8 回答 8

196

你在正确的轨道上。既然你说你不能修改全局设置,那么下一个最好的办法是根据JsonConverter需要应用属性,正如你所建议的那样。事实证明,Json.Net 已经内置了一个IsoDateTimeConverter可以让您指定日期格式的功能。不幸的是,您不能通过JsonConverter属性设置格式,因为属性的唯一参数是类型。但是,有一个简单的解决方案:子类化IsoDateTimeConverter,然后在子类的构造函数中指定日期格式。在需要的地方应用JsonConverter属性,指定您的自定义转换器,然后您就可以开始了。以下是所需的全部代码:

class CustomDateTimeConverter : IsoDateTimeConverter
{
    public CustomDateTimeConverter()
    {
        base.DateTimeFormat = "yyyy-MM-dd";
    }
}

如果您不介意也有时间,您甚至不需要子类化 IsoDateTimeConverter。它的默认日期格式是yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK(如源代码中所示)。

于 2013-09-05T15:03:57.997 回答
136

您可以使用这种方法:

public class DateFormatConverter : IsoDateTimeConverter
{
    public DateFormatConverter(string format)
    {
        DateTimeFormat = format;
    }
}

并以这种方式使用它:

class ReturnObjectA 
{
    [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")]
    public DateTime ReturnDate { get;set;}
}

DateTimeFormat字符串使用此处描述的 .NET 格式字符串语法:https ://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

于 2017-07-03T20:30:02.367 回答
67

It can also be done with an IsoDateTimeConverter instance, without changing global formatting settings:

string json = JsonConvert.SerializeObject(yourObject,
    new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });

This uses the JsonConvert.SerializeObject overload that takes a params JsonConverter[] argument.

于 2016-03-23T09:31:06.380 回答
23

也可以使用序列化程序设置重载之一:

var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" });

或者

var json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" });

采用 Type 的重载也是可用的。

于 2016-04-29T16:25:27.907 回答
7

我一直在使用另一种解决方案。只需创建一个字符串属性并将其用于 json。此属性将返回格式正确的日期。

class JSonModel {
    ...

    [JsonIgnore]
    public DateTime MyDate { get; set; }

    [JsonProperty("date")]
    public string CustomDate {
        get { return MyDate.ToString("ddMMyyyy"); }
        // set { MyDate = DateTime.Parse(value); }
        set { MyDate = DateTime.ParseExact(value, "ddMMyyyy", null); }
    }

    ...
}

这样您就不必创建额外的类。此外,它还允许您创建不同的数据格式。例如,您可以使用相同的 DateTime 轻松创建另一个 Hour 属性。

于 2019-04-05T11:38:33.847 回答
6

带以下转换器

public class CustomDateTimeConverter : IsoDateTimeConverter
    {
        public CustomDateTimeConverter()
        {
            DateTimeFormat = "yyyy-MM-dd";
        }

        public CustomDateTimeConverter(string format)
        {
            DateTimeFormat = format;
        }
    }

可以使用默认的自定义格式

class ReturnObjectA 
{
    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime ReturnDate { get;set;}
}

或任何指定的属性格式

class ReturnObjectB 
{
    [JsonConverter(typeof(CustomDateTimeConverter), "dd MMM yy")]
    public DateTime ReturnDate { get;set;}
}
于 2020-06-22T01:21:56.610 回答
3
public static JsonSerializerSettings JsonSerializer { get; set; } = new JsonSerializerSettings()
        {
            DateFormatString= "yyyy-MM-dd HH:mm:ss",
            NullValueHandling = NullValueHandling.Ignore,
            ContractResolver = new LowercaseContractResolver()
        };

你好,

当我需要设置 JsonSerializerSettings 时,我正在使用此属性

于 2021-01-21T20:40:42.177 回答
0

有时修饰 json 转换属性不起作用,它会通过异常说“ 2010-10-01”是有效日期。为了避免这种类型,我删除了属性上的 json convert 属性,并在下面的 deserilizedObject 方法中提到。

var addresss = JsonConvert.DeserializeObject<AddressHistory>(address, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" });
于 2018-11-30T10:20:26.957 回答