簡體   English   中英

如何使用 refit 序列化 DateOnly。?

[英]How to serialize DateOnly using refit.?

自 3-4 天以來,我一直在尋找這個,我幾乎得到了答案,但我仍然無法在我的代碼中實現。 實際上,通過查看文檔,我永遠無法理解或無法工作。 :/

而且我還需要另一個建議,我只使用日期,因為我需要實現從某個日期到某個日期的日期范圍過濾器,而且我不需要任何時間。 這是正確的方法還是我應該使用 DateTime。?

此鏈接解釋有關 C# DateOnly 序列化

這個鏈接解釋了關於改裝序列化選項的修改(我猜)

試試下面這個最小可重現的例子 當您從接口創建Refit實例時,可以傳遞一些選項,其中之一是可以附加自定義轉換器的ContentSerializer屬性。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM