Sysmte.Text.Json 默认不支持反序列化空字符串,下面的代码
var blogPost = JsonSerializer.Deserialize<BlogPost>(string.Empty);
public class BlogPost
{
public string Title { get; set; } = string.Empty;
}
运行时会报错 "The input does not contain any JSON tokens"
Unhandled exception. System.Text.Json.JsonException: The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
默认情况下,System.Text.Json 不支持将空字符串反序列化为 null。但是,您可以通过使用 JsonStringEnumConverter 和 JsonConverter<T> 类来支持反序列化空字符串。
以下是使用 JsonStringEnumConverter 来支持反序列化空字符串的示例:
using System.Text.Json;
using System.Text.Json.Serialization;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
[JsonConverter(typeof(JsonStringEnumConverter))]
public Gender Gender { get; set; }
}
public enum Gender
{
Male,
Female
}
public static void Main()
{
string json = "{\"Name\":\"John Doe\",\"Age\":30,\"Gender\":\"\"}";
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
Converters = { new JsonStringEnumConverter() }
};
var person = JsonSerializer.Deserialize<Person>(json, options);
Console.WriteLine($"Name: {person.Name}");
Console.WriteLine($"Age: {person.Age}");
Console.WriteLine($"Gender: {person.Gender}");
}
在上面的示例中,我们使用了 JsonStringEnumConverter 来支持 Gender 属性的反序列化。此外,我们设置了 PropertyNameCaseInsensitive 选项,以便忽略属性名称的大小写。
如果您要支持其他类型的属性的反序列化,您可以使用自定义的 JsonConverter<T> 类。以下是一个示例:
public class CustomStringConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if(reader.TokenType == JsonTokenType.String && reader.GetString() == string.Empty)
{
return default;
}
return JsonSerializer.Deserialize<T>(ref reader, options);
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
[JsonConverter(typeof(CustomStringConverter<Gender>))]
public Gender Gender { get; set; }
}
在上面的示例中,我们定义了一个 CustomStringConverter<T> 类来支持 T 类型的属性反序列化。在 Read 方法中,我们检查了是否遇到了空字符串,如果是,则返回默认值。
然后,我们将 CustomStringConverter<Gender> 指定为 Gender 属性的 JsonConverter。这将使 System.Text.Json 在反序列化 Gender 属性时使用 CustomStringConverter<Gender> 类。