Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表中属性的动态JsonIgnore_C#_Json_Json.net - Fatal编程技术网

C# 列表中属性的动态JsonIgnore

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", "

我正在使用图书馆。我有一些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; }
}
公共类选项
{
公共列表模板{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;
}