我正在使用 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", "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; }
}
这工作正常,但在某些情况下(并非总是如此),我想防止在再次序列化对象时包含 Fields
和 Formats
属性(尽管我确实想将 Name
属性保留在序列化输出中)。我考虑过在FieldTemplate
中使用ShouldSerializeFields()
和ShouldSerializeFormats()
,然后循环访问对象以设置每个方法都可以读取的布尔属性,但它看起来并不优雅。有没有更好的方法?例如,我可以在Options
中设置布尔属性,然后FieldTemplate
可以使用这些属性。我不知道该怎么做,甚至不知道是否可能。
我为想要动态显示/隐藏的每个属性使用了一个带有开关的静态类:
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;
}
}
然后从其他地方我可以启用/禁用这些属性:
if (condition)
{
FieldTemplate_JSONSerialization_Switches.Fields = true;
FieldTemplate_JSONSerialization_Switches.Formats = false;
}
else
{
FieldTemplate_JSONSerialization_Switches.Fields = false;
FieldTemplate_JSONSerialization_Switches.Formats = true;
}
这里有类似的问题和答案。
Json.Net 有关条件属性的文档
编辑要不迭代集合,请创建静态对象并在 ShouldSerializeXYZ() 中检查其属性。