C# 列表中属性的动态JsonIgnore
我正在使用图书馆。我有一些JSON,如下所示:C# 列表中属性的动态JsonIgnore,c#,json,json.net,C#,Json,Json.net,我正在使用图书馆。我有一些JSON,如下所示: "Templates": [ { "Name": "Default Fields 1", "Fields": [16, 10, 0, 4, 5, 11, 12, 7, 15, 17, 9, 25, 3], "Formats": [ "string", "datetime", "LeftZeroPaddedString13", "2dp", "2dp", "2dp", "
"Templates": [
{
"Name": "Default Fields 1",
"Fields": [16, 10, 0, 4, 5, 11, 12, 7, 15, 17, 9, 25, 3],
"Formats": [
"string", "datetime", "LeftZeroPaddedString13", "2dp", "2dp", "2dp", "2dp", "int", "int",
"string", "int", "int", "int", "int"
]
},
{
"Name": "Default Fields 2",
"Fields": [3, 25, 9, 17, 15, 7, 12, 11, 5, 4, 0, 10, 16],
"Formats": [
"int", "int", "int", "int", "string", "int", "int", "2dp", "2dp", "2dp", "2dp", "LeftZeroPaddedString13",
"datetime", "string"
]
}]
我正在将其反序列化到以下类中的Templates
属性:
public class Options
{
public List<FieldTemplate> Templates { get; set; }
}
public class FieldTemplate
{
public string Name { get; set; }
public List<int> Fields { get; set; }
public List<string> Formats { get; set; }
}
公共类选项
{
公共列表模板{get;set;}
}
公共类字段模板
{
公共字符串名称{get;set;}
公共列表字段{get;set;}
公共列表格式{get;set;}
}
这很好,但在某些情况下(并非总是如此),我希望在再次序列化对象时防止包含
字段
和格式
属性(尽管我确实希望在序列化输出中保留名称
属性)。我曾经考虑过在FieldTemplate
中使用ShouldSerializeFields()
和ShouldSerializeFormats()
,然后在对象中循环设置一个布尔属性,这些方法中的每一个都可以读取该属性,但它看起来并不优雅。有更好的办法吗?例如,我可以在Options
中设置布尔属性,然后FieldTemplate
可以使用这些属性。我不知道该怎么做,甚至不知道是否有可能。这里有一个类似的问题
关于的Json.Net文档
编辑
为了不在集合上迭代,请创建静态对象并在ShouldSerializeXYZ()中检查其属性。最后,我使用了一个静态类,该类带有一个开关,用于动态显示/隐藏每个属性:
public class FieldTemplate_JSONSerialization_Switches
{
public static bool Fields = true;
public static bool Formats = true;
}
public class Options
{
public List<FieldTemplate> Templates { get; set; }
}
public class FieldTemplate
{
public string Name { get; set; }
public List<int> Fields { get; set; }
public List<string> Formats { get; set; }
// instructions to Json.NET
public bool ShouldSerializeFields()
{
return FieldTemplate_JSONSerialization_Switches.Fields;
}
public bool ShouldSerializeFormats()
{
return FieldTemplate_JSONSerialization_Switches.Formats;
}
}
这就是我在问题中提到的
ShouldSerializeXYZ()
。我遇到的问题更多的是,当它位于列表中的对象中时,如何有条件地触发ShouldSerializeXYZ()
。好吧,我的错误。然后创建静态对象并检查其在ShouldSerializeXYZ()中的属性:)您可以使用自定义协定解析器来完成此操作。见安德鲁·惠特克的答案;看起来这应该能满足你的需要。谢谢@BrianRogers。最后,我接受了Vitaley的建议,使用了一个静态类,因为它更适合我的需要。我会发布一个答案。
if (condition)
{
FieldTemplate_JSONSerialization_Switches.Fields = true;
FieldTemplate_JSONSerialization_Switches.Formats = false;
}
else
{
FieldTemplate_JSONSerialization_Switches.Fields = false;
FieldTemplate_JSONSerialization_Switches.Formats = true;
}