首页 新闻 会员 周边

.NET: 如何让 Sysmte.Text.Json 支持反序列化空字符串

0
悬赏园豆:30 [待解决问题]

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.
dudu的主页 dudu | 高人七级 | 园豆:30943
提问于:2023-02-22 10:13
< >
分享
所有回答(1)
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> 类。

LuoCore | 园豆:122 (初学一级) | 2023-03-31 09:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册