Bal*_*e47 14 c# json json.net .net-6.0
我有一个来自对象的 JSON 调用:
 public record SaveDate(DateOnly StartDate, string EndDate, Object[] objects);
var saveDate= new SaveDate(DateOnly.MinValue, DateTime.MaxValue.ToString("yyyy-MM-dd"), 
new Object[] { objects});
当执行 API 调用时,它最终返回
{
    "startDate": {
        "year": 1,
        "month": 1,
        "day": 1,
        "dayOfWeek": 1,
        "dayOfYear": 1,
        "dayNumber": 0
    },
    "endDate": "2022-07-07",
    "Object": [
        {
            "foo": "bar"
                }
            ]
        }
    ]
}
但是我需要从 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)})); 
欲System.Text.Json看此答案。
UPD
最近发布的13.0.2版本Newtonsoft.Json 支持 DateOnly和TimeOnly:
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));
    }
}
用法是一样的:
class MyClass
{
    [JsonConverter(typeof(DateOnlyJsonConverter))]
    public DateOnly dt { get; set; }
}
| 归档时间: | 
 | 
| 查看次数: | 21690 次 | 
| 最近记录: |