动态JsonIgnore用于列表中的属性

时间:2016-06-09 06:31:14

标签: c# json json.net

我正在使用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; }
}

这样可以正常工作,但在某些情况下(并非总是如此)我想阻止在我再次序列化对象时包含FieldsFormats属性(尽管我想保留{序列化输出中的{1}}属性。我已经考虑过在Name中使用ShouldSerializeFields()ShouldSerializeFormats(),然后循环遍历该对象以设置一个布尔属性,这些属性可以读取每个方法,但它看起来并不优雅。有没有更好的办法?例如,我可以在FieldTemplate中设置布尔属性,Options可以使用它。我不知道怎么做,或者即使它可能。

2 个答案:

答案 0 :(得分:0)

最后,我使用了一个带有开关的静态类,用于我想要动态显示/隐藏的每个属性:

<!DOCTYPE html>
<html>
<head>
    <title>Blah</title>
</head>
<body>
<div id="leftSide">

</div>
<script>    
    var number_of_faces = 0;
    var theLeftSide = document.getElementById("leftSide");

    function generate_faces() {
        for (number_of_faces = 0; number_of_faces < 5; number_of_faces++) {
            newFace = document.createElement("img");
            newFace.setAttribute(
              "src",
              "http://home.cse.ust.hk/~rossiter/mooc/matching_game/smile.png"
            );
            theLeftSide.appendChild(newFace);
        }   
   }
   generate_faces();


</script>
</body>
</html>

然后从其他地方我可以启用/禁用这些属性:

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;
    }
}

答案 1 :(得分:-1)

以下是类似的问题和answer

关于ConditionalProperties

的Json.Net文档

修改 要不迭代集合,请创建静态对象并在ShouldSerializeXYZ()中检查它的属性。