gpt4 book ai didi

c# - 整个类型的 Json.NET 条件序列化

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:25 25 4
gpt4 key购买 nike

我知道 Json.NET 使用 ShouldSerialize{PropName} 支持条件序列化

但是有什么方法可以防止整个类型在不更改引用它的类型的情况下被序列化吗?例如

 public class Foo
{
public bool Enabled {get;set;}
...other properties
}

public class Bar
{
public Foo SomeFoo {get;set;}
public Foo OtherFoo {get;set;}
}

我希望 Bar 类型不包含 SomeFooo 或 OtherFoo,具体取决于是否设置了 Enabled 属性。如果 SomeFoo.Enabled = false,则不应序列化 Bar.SomeFoo。

所以我想要一个引用属性的条件序列化。而且我不希望 Foo 类型的消费有任何额外的代码或属性。它应该全部放在 Foo 类型中。

我可以在 Bar 中添加 ShouldSerializeSomeFoo.. 但这不是我要找的..

最佳答案

您可以编写自定义 JsonConverter 来处理 Foo 的序列化。

我在下面写了一个非常基础的版本,但我建议您更深入地研究一下。

此版本保留属性引用,只是不序列化对象。您还可以为 Bar 编写一个转换器,它会忽略整个属性。

public class FooJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var foo = value as Foo;
if (foo == null || !foo.Enabled)
return;

writer.WriteStartObject();

writer.WritePropertyName("Enabled");
serializer.Serialize(writer, foo.Enabled);

//Write the rest of the serialization

writer.WriteEndObject();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return serializer.Deserialize(reader, objectType);
}

public override bool CanConvert(Type objectType)
{
return objectType == typeof (Foo);
}
}

用法:

var trueFoo = new Foo()
{
Enabled = true
};

var falseFoo = new Foo()
{
Enabled = false
};

var bar = new Bar()
{
SomeFoo = trueFoo,
OtherFoo = falseFoo
};


//{"SomeFoo":{"Enabled":true},"OtherFoo":null}
var json = JsonConvert.SerializeObject(bar, new FooJsonConverter());

关于c# - 整个类型的 Json.NET 条件序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28147314/

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