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 支持 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));
}
}
Run Code Online (Sandbox Code Playgroud)
用法是一样的:
class MyClass
{
[JsonConverter(typeof(DateOnlyJsonConverter))]
public DateOnly dt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21690 次 |
| 最近记录: |