我有一个自定义的 JSON 格式化程序,可以从 DateTime 值中删除时间戳。 以下是代码:
var isoJson = JsonConvert.SerializeObject(value, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" });
return isoJson;
当我使用该格式化程序时,由于我的 WebApiConfig 文件中 JSON.Net 格式化程序,上述格式化程序对字符串进行了两次序列化。 以下是 JSON.Net 格式化程序的代码:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
当我删除 JSON.Net 格式化程序并使用我的自定义格式化程序时,JSON 被序列化一次,但它嵌入在 XML 中。
如何在不将 JSON 嵌入到 XML 中的情况下删除 JSON.Net 格式化程序并使用我的自定义格式化程序?
API 不会将字符串转换为 Json 两次,除非您告诉它这样做,也不会使用 XML。但是,您没有提供任何代码,因此无法说明为什么会出现这些问题。
不过,解决原始问题,仅将DateTime
属性序列化为日期,非常容易。只需创建自定义转换器,并通过属性将其应用于所需的属性即可。这在 Json.NET 的 JSON 序列化日期中进行了描述。您可以在这个可以说是重复的SO问题中找到实际的实现。
从该问题复制,创建一个转换器:
public class OnlyDateConverter : IsoDateTimeConverter
{
public OnlyDateConverter()
{
DateTimeFormat = "yyyy-MM-dd";
}
}
然后将其应用于要序列化为仅日期的任何属性:
public class MyClass
{
...
[JsonConverter(typeof(OnlyDateConverter))]
public DateTime MyDate{get;set;}
...
}
同一问题中的另一个答案显示了如何通过配置全局进行更改:
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd" });
或者,使用自定义转换器:
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
new OnlyDateConverter());