在使用 System.Text.Json
进行 JSON 反序列化时,可能会遇到无法正确处理 DateTime
、Guid
或枚举类型的情况。这些问题通常是由于默认的反序列化行为不满足特定需求导致的。
System.Text.Json
是 .NET Core 和 .NET 5/6/7+ 中推荐的 JSON 序列化和反序列化库,具有高性能和低内存占用。问题原因:默认情况下,System.Text.Json
可能无法正确解析某些日期时间格式。
解决方法:
using System.Text.Json;
using System.Text.Json.Serialization;
public class MyClass
{
[JsonConverter(typeof(JsonStringConverter<DateTime>))]
public DateTime MyDateTime { get; set; }
}
public class JsonStringConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
return JsonSerializer.Deserialize<T>(reader.GetString(), options);
}
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
writer.WriteStringValue(JsonSerializer.Serialize(value, options));
}
}
问题原因:默认情况下,System.Text.Json
可能无法正确解析某些 Guid 格式。
解决方法:
using System.Text.Json;
using System.Text.Json.Serialization;
public class MyClass
{
[JsonConverter(typeof(JsonStringConverter<Guid>))]
public Guid MyGuid { get; set; }
}
public class JsonStringConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
return JsonSerializer.Deserialize<T>(reader.GetString(), options);
}
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
writer.WriteStringValue(JsonSerializer.Serialize(value, options));
}
}
问题原因:默认情况下,System.Text.Json
可能无法正确解析枚举值。
解决方法:
using System.Text.Json;
using System.Text.Json.Serialization;
public enum MyEnum
{
Value1,
Value2
}
public class MyClass
{
[JsonConverter(typeof(JsonStringConverter<MyEnum>))]
public MyEnum MyEnumValue { get; set; }
}
public class JsonStringConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
return JsonSerializer.Deserialize<T>(reader.GetString(), options);
}
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
writer.WriteStringValue(JsonSerializer.Serialize(value, options));
}
}
通过上述方法,可以解决 System.Text.Json
在反序列化 DateTime
、Guid
和枚举类型时遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云