首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用refit序列化DateOnly。?

如何使用refit序列化DateOnly。?
EN

Stack Overflow用户
提问于 2022-08-07 11:20:25
回答 1查看 194关注 0票数 1

从3-4天开始,我就在搜索这个问题,我几乎得到了答案,但仍然无法在我的代码中实现。实际上,我从来不理解或无法通过查看文档来工作。:/

我还需要另一个建议,我只使用日期,因为我需要实现一个日期范围过滤器,从日期到某个日期点,我不需要任何时间。这是一个正确的方式,还是我应该使用DateTime。

本链接解释关于C# DateOnly序列化的内容。

这个链接解释了关于改装序列化选项的修改(我猜)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-08 09:31:54

试试下面的最小可重现性-示例。当您从接口创建Refit实例时,可以传递一些选项,其中一个选项是可以附加自定义转换器的ContentSerializer属性。

代码语言:javascript
复制
using Refit;
using System.Text.Json;
using System.Text.Json.Serialization;

var options = new JsonSerializerOptions();
options.Converters.Add(new DateOnlyConverter());
options.Converters.Add(new TimeOnlyConverter());

var postmanEchoApi = RestService.For<IPostmanEchoApi>("https://postman-echo.com", new RefitSettings
{
  ContentSerializer = new SystemTextJsonContentSerializer(options)
});

var echo = await postmanEchoApi.Echo(new Args
{
  dateOnly = DateOnly.FromDateTime(DateTime.Now),
  timeOnly = TimeOnly.FromDateTime(DateTime.Now),
});

Console.WriteLine(echo.args.dateOnly);
Console.WriteLine(echo.args.timeOnly);


public class DateOnlyConverter : JsonConverter<DateOnly>
{
  private readonly string serializationFormat;

  public DateOnlyConverter() : this(null) { }

  public DateOnlyConverter(string? serializationFormat)
  {
    this.serializationFormat = serializationFormat ?? "yyyy-MM-dd";
  }

  public override DateOnly Read(ref Utf8JsonReader reader,
                          Type typeToConvert, JsonSerializerOptions options)
  {
    var value = reader.GetString();
    return DateOnly.FromDateTime(DateTime.Parse(value!));
  }

  public override void Write(Utf8JsonWriter writer, DateOnly value,
                                      JsonSerializerOptions options)
      => writer.WriteStringValue(value.ToString(serializationFormat));
}

public class TimeOnlyConverter : JsonConverter<TimeOnly>
{
  private readonly string serializationFormat;

  public TimeOnlyConverter() : this(null) { }

  public TimeOnlyConverter(string? serializationFormat)
  {
    this.serializationFormat = serializationFormat ?? "HH:mm:ss.fff";
  }

  public override TimeOnly Read(ref Utf8JsonReader reader,
                          Type typeToConvert, JsonSerializerOptions options)
  {
    var value = reader.GetString();
    return TimeOnly.FromDateTime(DateTime.Parse(value!));
  }

  public override void Write(Utf8JsonWriter writer, TimeOnly value,
                                      JsonSerializerOptions options)
      => writer.WriteStringValue(value.ToString(serializationFormat));
}

public class Args {
    public DateOnly dateOnly { get; set; }
    public TimeOnly timeOnly { get; set; }
}

public class Echo
{
    public Args args { get; set; }
}

[Headers("user-agent: curl/7.79.1")]
public interface IPostmanEchoApi
{
  [Get("/get")]
  Task<Echo> Echo(Args queryParams);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73266960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档