12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- using System;
- using System.Text.Json;
- using System.Text.Json.Serialization;
- /// <summary>
- ///
- /// </summary>
- public class JsonDateTimeConverter : JsonConverter<DateTime>
- {
- private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff tt";
- /// <summary>
- /// Reads and converts the JSON to type.
- /// </summary>
- /// <param name="reader">The reader.</param>
- /// <param name="typeToConvert">The type to convert.</param>
- /// <param name="options">An object that specifies serialization options to use.</param>
- /// <returns>
- /// The converted value.
- /// </returns>
- /// <exception cref="System.Text.Json.JsonException">
- /// Unexpected token type: {reader.TokenType}
- /// or
- /// Unable to convert '{dateTimeString}' to DateTime
- /// </exception>
- public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
- {
- if (reader.TokenType != JsonTokenType.String)
- {
- throw new JsonException($"Unexpected token type: {reader.TokenType}");
- }
- string dateTimeString = reader.GetString();
- if (DateTime.TryParseExact(dateTimeString, DateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime dateTime))
- {
- return dateTime;
- }
- else
- {
- throw new JsonException($"Unable to convert '{dateTimeString}' to DateTime");
- }
- }
- /// <summary>
- /// Writes a specified value as JSON.
- /// </summary>
- /// <param name="writer">The writer to write to.</param>
- /// <param name="value">The value to convert to JSON.</param>
- /// <param name="options">An object that specifies serialization options to use.</param>
- public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
- {
- string dateTimeString = value.ToString(DateTimeFormat);
- writer.WriteStringValue(dateTimeString);
- }
- /// <summary>
- /// Determines whether the specified type can be converted.
- /// </summary>
- /// <param name="typeToConvert">The type to compare against.</param>
- /// <returns>
- /// <see langword="true" /> if the type can be converted; otherwise, <see langword="false" />.
- /// </returns>
- public override bool CanConvert(Type typeToConvert)
- {
- return typeToConvert == typeof(DateTime);
- }
- }
|