2016-06-09 65 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; 
}