使用Web API 2的自定义JSON格式化程序

时间:2017-01-13 07:35:48

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

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

1 个答案:

答案 0 :(得分: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());