ASP.NET Web API的JSON输出中的日期不带时间

nfg76nw0  于 2023-10-21  发布在  .NET
关注(0)|答案(4)|浏览(129)

有没有一种简单的方法来配置JSON.NET,以便一些DateTime字段将被格式化为没有时间,而其他DateTime字段仍将被格式化为时间?
范例:

{ firstName: 'John', lastName : 'Doe', birthday: '1965-09-23' }
7cjasjjr

7cjasjjr1#

如果您需要它只影响特定字段,请先创建转换器类型:

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

然后将此属性添加到您想要的任何字段/属性中:

[JsonConverter(typeof(OnlyDateConverter))]
qncylg1j

qncylg1j2#

尝试添加此行以配置Web API:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
    new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd" });
pprl5pva

pprl5pva3#

Youssef的OnlyDateConverter答案是最好的。但这里有一个替代方案:

private DateTime _birthday;
public string Birthday
{
    get { return _birthday.ToString("yyyy-MM-dd"); }
    set {
          _birthday = DateTime.ParseExact(value, "yyyy-MM-dd",
                                          CultureInfo.InvariantCulture);
        }
}

优点-您不需要将Newtonsoft.Json库绑定到您的类。
缺点-该属性现在在您使用它的任何地方都公开为字符串,这可能会导致它自己的一系列问题。

t1qtbnec

t1qtbnec4#

Youssef的Answer在使用Newtonsoft.Json序列化模型中的单个字段时有效。但默认情况下,核心使用System.Text.Json来序列化对象。同样的事情可以在没有Newtonsoft的情况下在核心中实现,如下所示:

using System.Text.Json.Serialization;

internal class JsonOnlyDateConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.ParseExact(reader.GetString()!, "yyyy-MM-dd", CultureInfo.InvariantCulture);            
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture));            
    }
}

并在模型中使用它:

using System.Text.Json.Serialization;

...

[JsonConverter(typeof(JsonOnlyDateConverter))]
public DateTime MyDateField { get; set; }

相关问题