将 JSON 从对象序列化为字符串/DateOnly

Bal*_*e47 14 c# json json.net .net-6.0

我有一个来自对象的 JSON 调用:

 public record SaveDate(DateOnly StartDate, string EndDate, Object[] objects);
Run Code Online (Sandbox Code Playgroud)
var saveDate= new SaveDate(DateOnly.MinValue, DateTime.MaxValue.ToString("yyyy-MM-dd"), 
new Object[] { objects});
Run Code Online (Sandbox Code Playgroud)

当执行 API 调用时,它最终返回

{
    "startDate": {
        "year": 1,
        "month": 1,
        "day": 1,
        "dayOfWeek": 1,
        "dayOfYear": 1,
        "dayNumber": 0
    },
    "endDate": "2022-07-07",
    "Object": [
        {
            "foo": "bar"
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是我需要从 startDate 发送的格式与 endDate (“yyyy-MM-dd”)相同,而不是反序列化版本。我怎样才能做到这一点?

注意:我使用 DateOnly 作为类型 (.net 6.0),并且 API 需要采用上面指定的格式的字符串。

Gur*_*ron 20

DateOnly并且绑定尚未TimeOnly完全支持。您可以为此类型实现自己的转换器:

public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    private const string Format = "yyyy-MM-dd";

    public override DateOnly ReadJson(JsonReader reader,
        Type objectType,
        DateOnly existingValue,
        bool hasExistingValue,
        JsonSerializer serializer) =>
        DateOnly.ParseExact((string)reader.Value, Format, CultureInfo.InvariantCulture);

    public override void WriteJson(JsonWriter writer, DateOnly value, JsonSerializer serializer) => 
        writer.WriteValue(value.ToString(Format, CultureInfo.InvariantCulture));
}

class MyClass
{
    [JsonConverter(typeof(DateOnlyJsonConverter))]
    public DateOnly dt { get; set; }
}

// prints {"dt":"2021-01-01"}
Console.WriteLine(JsonConvert.SerializeObject(new MyClass{dt = new DateOnly(2021,1,1)})); 
Run Code Online (Sandbox Code Playgroud)

System.Text.Json此答案

UPD

最近发布的13.0.2版本Newtonsoft.Json 支持 DateOnlyTimeOnly

13.0.2
新功能 - 添加对 DateOnly 和 TimeOnly 的支持


Mar*_*ijn 17

对于.NET 6,我必须稍微更新 Gugu Stron 的答案:

public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    private const string Format = "yyyy-MM-dd";

    public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateOnly.ParseExact(reader.GetString(), Format, CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(Format, CultureInfo.InvariantCulture));
    }
}
Run Code Online (Sandbox Code Playgroud)

用法是一样的:

class MyClass
{
    [JsonConverter(typeof(DateOnlyJsonConverter))]
    public DateOnly dt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • reader.GetString() 可以为 null。你确定它有效吗?这不适合我 (3认同)