C# 使用JsonConverter-System.Text.Json将Null属性设置为空字符串

C# 使用JsonConverter-System.Text.Json将Null属性设置为空字符串,c#,asp.net-core,C#,Asp.net Core,我一直在尝试使用JsonSerializer和一个自定义JsonConverter反序列化一些null参数,这些都是我在关于该主题的文章中看到的示例,但它不起作用 当我调试NullToEmptyStringConverter时,它似乎跳过了我特意设置为null的null参数Version,而只是返回有值的字符串。然后,当您调试反序列化对象时,它仍然是Version=null public class NullToEmptyStringConverter : JsonConverter<st

我一直在尝试使用
JsonSerializer
和一个自定义
JsonConverter
反序列化一些
null
参数,这些都是我在关于该主题的文章中看到的示例,但它不起作用

当我调试
NullToEmptyStringConverter
时,它似乎跳过了我特意设置为
null
的null参数
Version
,而只是返回有值的
字符串。然后,当您调试反序列化对象时,它仍然是
Version=null

public class NullToEmptyStringConverter : JsonConverter<string> {

    public override bool CanConvert(Type typeToConvert) {
        return typeToConvert == typeof(string);
    }

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

        if(value == null) {
            value = "";
        }
        return value;
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) {
        throw new NotImplementedException();
    }
}
添加到
转换器

var options = new JsonSerializerOptions();
options.Converters.Add(new NullToEmptyStringConverter());

var config = JsonSerializer.Deserialize<ConfigRoot>(responseData.ToString(), options);
var options=newJSONSerializeRoptions();
添加(新的NullToEmptyStringConverter());
var config=JsonSerializer.Deserialize(responseData.ToString(),选项);
当我调试
NullToEmptyStringConverter
时,它似乎跳过了null参数
Version

JsonConverter
包含一个名为
HandleNull
的虚拟属性,默认情况下该属性为
false
。因此,
NullToEmptyStringConverter
不用于
null
值。重写getter并将其设置为返回
true
,如下所示:

public override bool HandleNull => true;
…为什么即使我已将Read方法置于Version属性之上,仍会对每个参数调用Read方法

public class Application {

    [JsonPropertyName("version")]
    [JsonConverter(typeof(NullToEmptyStringConverter))]
    public string Version { get; set; }

    [JsonPropertyName("name")]
    public string Name { get; set; }

    [JsonPropertyName("description")]
    public string Description { get; set; }
}
在您的示例中,您有以下行:


这会将
NullToEmptyStringConverter
注册为全局转换器。删除此注册,由于
[JsonConverter]
属性,转换器将仅为
版本运行。

感谢回复,我添加了
公共覆盖bool HandleNull=>true现在它命中了
Write
方法,该方法抛出了一个未实现的异常
作为您的
写入
实现。我不知道在
写入
方法中放入什么,因此我将其保留原样。在我从中复制代码的帖子中,声明它不是必需的。如果你在应用程序中的任何地方将
应用程序
写入JSON,它都是必需的,可能是作为控制器响应的一部分。您显示的示例代码只读取,但应用程序中的其他部分必须执行写入操作。啊,好的,我刚刚添加了
writer.WriteStringValue(value??)而且它似乎在正常工作:-)也许你应该在你的答案中包含这个,我会把它标记为正确的。也投了赞成票
options.Converters.Add(new NullToEmptyStringConverter());