2016-06-09 81 views
0

我正在使用JSON.Net库。我有一些JSON看起来像这样:动态JsonIgnore列表中的属性

"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属性被包括在我再次序列化对象时(虽然我确实想在序列化输出中保留Name属性)。我曾考虑在FieldTemplate之内使用ShouldSerializeFields()ShouldSerializeFormats(),然后遍历该对象以设置每个这些方法都可以读取的布尔属性,但它看起来不够优雅。有没有更好的办法?例如,我可以在Options中设置布尔属性,然后FieldTemplate可以使用。我不知道该怎么做,或者即使有可能。

+0

您可以使用自定义合约解析程序来执行此操作。请参阅Andrew Whitaker在[Dynamic json serialization filtering via reflection]中的回答(http://stackoverflow.com/q/28606326/10263);看起来像应该适合您的需求。 –

+0

谢谢@BrianRogers。最后,我接受了Vitaliy的建议并使用了静态课程,因为这更符合我的需求。我会为此发布一个答案。 – mulllhausen

回答

-1

这里是类似的问题answer

Json.Net文档中关于ConditionalProperties

编辑 为了不遍历集合创建静态对象,并检查它的内部ShouldSerializeXYZ属性()。

+0

这就是我在我的问题中提到的'ShouldSerializeXYZ()'。我遇到的问题更多的是如何在列表中的对象内条件触发'ShouldSerializeXYZ()'。 – mulllhausen

+1

好吧,我的错误。然后创建静态对象,并检查它的ShouldSerializeXYZ()内的属性:) –

+0

这将工作。谢谢。 – mulllhausen

0

最后,我使用的静态类与每个属性我想切换到动态显示/隐藏:

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