gpt4 book ai didi

c# - 列表中不同值的不同 JsonSerializerSettings

转载 作者:行者123 更新时间:2023-12-04 09:30:57 34 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Supporting multiple custom DateTime formats when deserializing with Json.Net

(2 个回答)


1年前关闭。




我正在使用此设置来序列化 中的对象列表dotnet 核心 2.2 :

var settings = new JsonSerializerSettings()
{
DateFormatString = "MM/dd/yyyy h:mm tt"
}
问题是如果 DateTimes 时间等于 0,我希望它使用“MM/dd/yyyy”序列化和反序列化 DateTimes,并且我发现没有动态方法可以在具有两个值的同一列表中执行此操作(DateTimes 具有不同的时间,0 与否0)

最佳答案

您可以为此编写自己的 json 转换器。

public class DateTimeStringConverter : JsonConverter
{
// allowable DateTime formats - update as required
List<string> DateFormats => new List<string> { "MM/dd/yyyy", "MM/dd/yyyy h:mm tt" };

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var dateStr = (string)reader.Value;
DateTime date;
foreach (string format in DateFormats)
{
if (DateTime.TryParseExact(dateStr, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
return date;
}
}

throw new JsonException($"{dateStr} as not a valid date string.");
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
DateTime date = DateTime.Parse(value.ToString());
// Time value of DateTime.Today is always "00:00:00"
if (date.TimeOfDay == DateTime.Today.TimeOfDay)
{
serializer.Serialize(writer, date.ToString("MM/dd/yyyy"));
}
else
{
serializer.Serialize(writer, date.ToString("MM/dd/yyyy h:mm tt"));
}
}

public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateTime);
}
}
您可以通过更改 DateFormats 来改善这一点初始化 JsonSerializerSettings 时传递到公共(public)列表并传递有效的日期时间格式.
然后你可以应用这样的设置:
var settings = new JsonSerializerSettings();
settings.DateParseHandling = DateParseHandling.None;
settings.Converters.Add(new DateTimeStringConverter());

// deserialize
var model = JsonConvert.DeserializeObject<YourClass>(json, settings);

// serialize
var serializedJson = JsonConvert.SerializeObject(model, settings);
这是受 question 答案的启发。

关于c# - 列表中不同值的不同 JsonSerializerSettings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62847021/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com