使用自定义JSON格式的Web API 2(Using a custom JSON formatte

2019-09-30 12:01发布

我有一个自定义的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.Net格式,并使用我的自定义格式,而无需我的JSON嵌入XML?

Answer 1:

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


文章来源: Using a custom JSON formatter for Web API 2