【发布时间】:2021-04-23 10:53:20
【问题描述】:
我不想在json文件中保存一些属性,所以我使用了 [JsonIgnore] 属性但是不起作用并且所有属性都被保存了
public abstract class SettingBase
{
[JsonIgnore]
public abstract string FileName { get; set; }
public void Save()
{
JsonFile.Save(FileName, this);
}
}
public static class JsonFile
{
public static void Save<T>(string fileName, T @object)
{
using (StreamWriter writer = File.CreateText(fileName))
{
options = new JsonSerializerOptions();
options.Converters.Add(new PolymorphicJsonConverter<T>());
string json = JsonSerializer.Serialize(@object, options);
writer.Write(json);
}
}
}
我也使用下面的转换器来解决多态问题
public class PolymorphicJsonConverter<T> : JsonConverter<T>
{
public override bool CanConvert(Type typeToConvert)
{
return typeof(T).IsAssignableFrom(typeToConvert);
}
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
if (value is null)
{
writer.WriteNullValue();
return;
}
writer.WriteStartObject();
foreach (var property in value.GetType().GetProperties())
{
if (!property.CanRead)
continue;
var propertyValue = property.GetValue(value);
writer.WritePropertyName(property.Name);
JsonSerializer.Serialize(writer, propertyValue, options);
}
writer.WriteEndObject();
}
}
这是我的演示
public class DemoSettings : SettingBase
{
[JsonIgnore]
public bool boo { get; set; }
public int integ { get; set; }
public string str { get; set; }
public override string FileName { get; set; } = "test.json";
}
我希望 FileName 和 boo 不会保存在文件中,但它们都保存了
{
"boo": true,
"integ": 25,
"str": "sss",
"FileName": "test.json"
}
【问题讨论】:
标签: c# json .net-core system.text.json