.net 空属性的系统文本Json转换器

n9vozmp4  于 2023-08-08  发布在  .NET
关注(0)|答案(1)|浏览(87)

我需要将和对象序列化为JSON,以将有效负载传递给Python脚本。C#中具有null值的属性应该在JSON中具有None值,传递给Python才能工作。我创建了一个JsonConverter来检查值是否为null,并写入None。但是,它永远不会被调用。由于可以为null的属性之一是字符串类型(其他可以为float?,int?,等等)我还创建了一个JsonConverter:

public class NullJsonConverter : JsonConverter<string>
{
    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var jsonString = reader.GetString();

        if (!string.IsNullOrEmpty(jsonString))
        {
            return JsonSerializer.Deserialize<string>(jsonString, options);
        }

        return null;
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
    {
        if (value == null)
        {
            //Logic to convert from null to None
        }

        JsonSerializer.Serialize(writer, value);
    }
}

字符串
但是,当我序列化一个包含string类型属性的对象时,只有当属性有值时才调用转换器。
以下是我在序列化中使用的选项:

return new JsonSerializerOptions()
{
    DefaultIgnoreCondition = JsonIgnoreCondition.Never,
    WriteIndented = true,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    Converters =
    {
        new JsonStringEnumConverter(),
        new NullJsonConverter()
    }
};


我错过了什么?我如何在C#和object中序列化,使null属性在JSON中反映为None,并且当反序列化返回时转换回null?

kzmpq1sx

kzmpq1sx1#

尝试覆盖HandleNull属性并将其设置为true。就像本期中所描述的:https://github.com/dotnet/runtime/issues/44006#issuecomment-719002484

public class NullJsonConverter : JsonConverter<string>
{
    public override bool HandleNull => true;

    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var jsonString = reader.GetString();

        if (!string.IsNullOrEmpty(jsonString))
        {
            return JsonSerializer.Deserialize<string>(jsonString, options);
        }

        return null;
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
    {
        if (value == null)
        {
            //Logic to convert from null to None
        }

        JsonSerializer.Serialize(writer, value);
    }
}

字符串

相关问题