【问题标题】:Using a custom JSON formatter for Web API 2为 Web API 2 使用自定义 JSON 格式化程序
【发布时间】:2017-05-28 12:36:15
【问题描述】:

我有一个自定义 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 格式化程序并使用我的自定义格式化程序?

【问题讨论】:

  • 您为什么要尝试全局替换转换器而不是将转换器属性应用于仅日期属性?这个similar question 展示了将[JsonConverter(typeof(OnlyDateConverter))] 添加到属性是多么容易

标签: c# json asp.net-web-api json.net


【解决方案1】:

Web API 不会将字符串转换为 Json 两次,除非您告诉它这样做,它也不会使用 XML。但是您没有提供任何代码,因此无法说明为什么会出现这些问题。

不过,解决最初的问题,将DateTime 属性仅序列化为日期非常容易。只需创建一个自定义转换器并通过属性将其应用于您想要的属性。这在 Json.NET 的 Serializing Dates in JSON 中有描述。你可以找到一个实际的实现in this arguably duplicate SO question

复制那个问题,创建一个转换器:

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());

【讨论】:

  • 感谢您的各种解决方案。我去了配置路线,效果很好。
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多