gpt4 book ai didi

c# - 我可以选择在运行时关闭 JsonIgnore 属性吗?

转载 作者:IT王子 更新时间:2023-10-29 04:53:41 25 4
gpt4 key购买 nike

我正在使用一组类中的 Newtonsoft.Json 创建一个 JSON 文件。创建的文件非常大,因此我为属性创建了 JsonProperty 以减小大小,并为某些数据类型添加了 JsonIgnore 和自定义格式。

结果是从 24MB 减少到 1MB,这很好;但是,我希望可以选择在运行时生成完整版本或缩减属性版本。

有没有办法让序列化器有选择地使用属性?

最佳答案

是的,这可以使用自定义 ContractResolver 来完成。

您没有显示任何代码,所以我只是编一个例子。假设我有一个 Foo 类,如下所示。我想要序列化输出中的 IdName 属性,但我绝对对 AlternateNameColor 。我用 [JsonIgnore] 标记了那些。我希望显示说明,但有时这会变得很长,所以我使用自定义 JsonConverter 来限制它的长度。我还想为描述使用更短的属性名称,所以我用 [JsonProperty("Desc")] 标记了它。

class Foo
{
public int Id { get; set; }
public string Name { get; set; }
[JsonIgnore]
public string AlternateName { get; set; }
[JsonProperty("Desc")]
[JsonConverter(typeof(StringTruncatingConverter))]
public string Description { get; set; }
[JsonIgnore]
public string Color { get; set; }
}

当我序列化上面的一个实例时...

Foo foo = new Foo
{
Id = 1,
Name = "Thing 1",
AlternateName = "The First Thing",
Description = "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.",
Color = "Yellow"
};

string json = JsonConvert.SerializeObject(foo, Formatting.Indented);

...我得到这个输出:

{
"Id": 1,
"Name": "Thing 1",
"Desc": "This is some lengthy text describing Thing 1 "
}

现在,假设我有时想要获得完整的 JSON 输出,而忽略我的自定义设置。我可以使用自定义 ContractResolver 以编程方式“取消应用”类的属性。这是解析器的代码:

class IgnoreJsonAttributesResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
foreach (var prop in props)
{
prop.Ignored = false; // Ignore [JsonIgnore]
prop.Converter = null; // Ignore [JsonConverter]
prop.PropertyName = prop.UnderlyingName; // restore original property name
}
return props;
}
}

要使用解析器,我将其添加到 JsonSerializerSettings 并将设置传递给序列化程序,如下所示:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new IgnoreJsonAttributesResolver();
settings.Formatting = Formatting.Indented;

string json = JsonConvert.SerializeObject(foo, settings);

输出现在包括被忽略的属性,并且描述不再被截断:

{
"Id": 1,
"Name": "Thing 1",
"AlternateName": "The First Thing",
"Description": "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.",
"Color": "Yellow"
}

完整演示在这里:https://dotnetfiddle.net/WZpeWt

关于c# - 我可以选择在运行时关闭 JsonIgnore 属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37371786/

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