我有一个来自对象的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”)相同,而不是反序列化版本。我怎么能这么做?
注意:我使用DateOnly作为类型(.net 6.0),API需要一个字符串,格式为上面指定的格式。
发布于 2022-02-07 16:10:23
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的支持
发布于 2022-06-14 07:37:41
对于.NET 6,我不得不稍微更新古古斯特伦的答案:
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; }
}发布于 2022-02-25 13:58:16
我在正在做的F#项目中遇到了这个问题。这是F#等价的
type DateOnlyJsonConverter() =
inherit JsonConverter<DateOnly>()
let format = "yyyy-MM-dd"
override this.WriteJson(writer: JsonWriter, value: DateOnly, _: JsonSerializer): unit =
writer.WriteValue(value.ToString(format, CultureInfo.InvariantCulture))
override this.ReadJson(reader, _, _, _, _) =
DateOnly.ParseExact(reader.Value :?> string, format, CultureInfo.InvariantCulture)
type TimeOnlyJsonConverter() =
inherit JsonConverter<TimeOnly>()
let format = "HH:mm:ss.FFFFFFF"
override this.WriteJson(writer: JsonWriter, value: TimeOnly, _: JsonSerializer): unit =
writer.WriteValue(value.ToString(format, CultureInfo.InvariantCulture))
override this.ReadJson(reader, _, _, _, _) =
TimeOnly.ParseExact(reader.Value :?> string, format, CultureInfo.InvariantCulture)使用方法:
type Person = {
Name: string
BirthDate: DateOnly
}
let json = JsonConvert.SerializeObject(person, Formatting.None, DateOnlyJsonConverter())
(* result:
{ "name": "Ken", "birthDate": "1987-05-20" }
*)https://stackoverflow.com/questions/71021064
复制相似问题