![](/img/trans.png)
[英]System.Text.Json: when deserializing, how can I ignore a null or empty string value for a property that has a default value set in the constructor?
[英]Set Null Property To Empty String With JsonConverter - System.Text.Json
我一直在嘗試使用JsonSerializer
和自定義JsonConverter
反序列化一些null
參數, JsonSerializer
參數來自我看過的有關該主題的帖子的示例,但它不起作用。
當我調試NullToEmptyStringConverter
它似乎跳過了我故意設置為null
的空參數Version
並只返回具有值的string
值。 然后,當您調試反序列化對象時,它仍然是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();
}
}
我已將它添加到JsonSerializeOptions
並添加了屬性。 我感到困惑的另一件事是為什么即使我將Read
方法放在Version
屬性之上,也會為每個參數調用它?
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; }
}
添加到Converter
var options = new JsonSerializerOptions();
options.Converters.Add(new NullToEmptyStringConverter());
var config = JsonSerializer.Deserialize<ConfigRoot>(responseData.ToString(), options);
當我調試
NullToEmptyStringConverter
它似乎正在跳過 null 參數Version
...
JsonConverter<T>
包含一個名為HandleNull
的虛擬屬性,默認情況下為false
。 因此, NullToEmptyStringConverter
不用於null
值。 覆蓋 getter 並將其設置為返回true
,如下所示:
public override bool HandleNull => true;
...為什么即使我已將 Read 方法置於 Version 屬性之上,也會為每個參數調用它?
在您的示例中,您有以下行:
options.Converters.Add(new NullToEmptyStringConverter());
這將NullToEmptyStringConverter
注冊為全局轉換器。 由於[JsonConverter]
屬性,刪除此注冊並且轉換器將僅針對Version
屬性運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.