我想从我的Json中省略空字符串属性。
我是这么做的。
创建将空字符串转换为null的自定义转换器:
public class EmptyStringToNullConverter : JsonConverter<string>
{
public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return reader.GetString();
}
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
{
if (value == string.Empty)
writer.WriteNullValue();
else
writer.WriteStringValue(value);
}
}
我有一个JsonSerializerClass
,它基本上是System.Text.Json.JsonSerializer
的 Package 器,这个类使用了Converter:
public class JsonSerializerClass
{
private JsonSerializerOptions serializeOptions;
private JsonSerializerOptions deserializeOptions;
public JsonSerializerClass()
{
serializeOptions = new JsonSerializerOptions();
deserializeOptions = new JsonSerializerOptions();
InitSerializer();
InitDeserializer();
}
public JsonSerializerOptions SerializeOptions => serializeOptions;
public string Serialize(object value)
{
return Serialize(value, serializeOptions);
}
public T Deserialize<T>(string json)
{
var o = System.Text.Json.JsonSerializer.Deserialize<T>(json, deserializeOptions);
if (o == null)
throw new ArgumentException($"Cannot deserialize JSON to type {typeof(T)}: {json}");
return o;
}
public static string Serialize(object value, JsonSerializerOptions options)
{
return System.Text.Json.JsonSerializer.Serialize(value, options);
}
private void InitSerializer()
{
serializeOptions.Converters.Add(new EmptyStringToNullConverter());
serializeOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
}
private void InitDeserializer()
{
deserializeOptions.PropertyNameCaseInsensitive = true;
deserializeOptions.Converters.Add(new JsonStringEnumConverter());
deserializeOptions.Converters.Add(new DateOnlyConverter());
deserializeOptions.Converters.Add(new DateOnlyNullableConverter());
deserializeOptions.Converters.Add(new IntConverter());
deserializeOptions.Converters.Add(new DecimalConverter());
deserializeOptions.IncludeFields = true;
deserializeOptions.AllowTrailingCommas = true;
deserializeOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
deserializeOptions.ReadCommentHandling = JsonCommentHandling.Skip;
}
}
下面是我的测试案例:
var person = new Person
{
Name = "John",
LastName = "Doe",
MiddleName = ""
};
var serializer = new JsonSerializerClass();
var json = serializer.Serialize(person);
json.ToLower().Should().NotContain(nameof(person.MiddleName).ToLower());
我本以为MiddleName
不在json中,因为空字符串会变成null,并且null值应该从json中删除,但是MiddleName
却在json中,值为null
!
2条答案
按热度按时间xytpbqjk1#
在.NET 7中,您可以使用Modifier来影响序列化过程(announcement blog中提供了更多信息):
在本例中,所有内容都与
ShouldSerialize
属性有关,该属性接受value
,并允许您决定是否应该序列化它。使用上面链接的属性添加修饰符:
.NET Fiddle
0tdrvxhp2#
你可以试试这个自定义转换器
输出
也可以使用此函数