gpt4 book ai didi

c# - 在某些条件下序列化时忽略属性

转载 作者:太空狗 更新时间:2023-10-30 00:24:28 25 4
gpt4 key购买 nike

Json.net 有一个非常有用的属性,可以在名为 NullValueHandlingJsonPropertyAttribute 上设置。如果你像这样装饰一个属性:

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
string MyProp { get; set; }

那么如果 MyProp 为 null,它根本不会包含在输出中。

我想做类似的事情,但排除条件不同。例如 - 假设我们有一个枚举

public enum MyEnum { None = 0, Value1 = 1, Value2 = 2, Value3 = 4 };

还有一个属性

MyEnum MyProp { get; set; }

如果 MyProp == MyEnum.None,我希望将 MyProp 从输入中完全排除。

我知道一种解决方案是使用 MyEnum? 而不是 MyEnum 然后我可以再次使用 NullValueHandling ,但我不能在这里使用可空。我想我可以使用 JsonConverter 所以我尝试子类化 StringEnumConverter (因为我希望它们理想地输出为字符串):

    public class MyEnumConverter : Newtonsoft.Json.Converters.StringEnumConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(MyEnum);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// don't write if value is none
var v = (MyEnum)value;
if (v == MyEnum.None)
{
// what to do here? The two options below both include the property as null
//writer.WriteNull();
//serializer.Serialize(writer, null);
return; // just returning without doing anything will break the serialization
}
base.WriteJson(writer, value, serializer);
}
}

我可以或者应该尝试子类化 JsonProperty 吗?如果是这样,我需要重写什么才能获得我想要的行为?

我希望避免必须将转换器附加到包含此属性的类,因为这样我就必须手动序列化整个东西,这很痛苦。

最佳答案

您可以使用带有签名 public bool ShouldSerialize*PropertyName*() 的方法。

public enum MyEnum { None = 0, Value1 = 1, Value2 = 2, Value3 = 4 };

public class SomeClass
{
public MyEnum MyProp { get; set; }
public string Test = "aaaa";

public bool ShouldSerializeMyProp()
{
return MyProp != MyEnum.None;
}
}

var retVal1 = JsonConvert.SerializeObject(new SomeClass() { MyProp= MyEnum.None });
var retVal2 = JsonConvert.SerializeObject(new SomeClass() { MyProp = MyEnum.Value1 });

输出:

retVal1: {"Test":"aaaa"}

retVal2: {"Test":"aaaa","MyProp":1}

关于c# - 在某些条件下序列化时忽略属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25293605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com