2015-05-12 86 views
4

是否可以使用JSON.NET序列化靜態屬性而不向每個屬性添加[JsonProperty]屬性。 實施例類:如何序列化JSON.NET中的靜態屬性而不添加[JsonProperty]屬性

public class Settings 
    { 
     public static int IntSetting { get; set; } 
     public static string StrSetting { get; set; } 

     static Settings() 
     { 
      IntSetting = 5; 
      StrSetting = "Test str"; 
     } 
    } 

預期結果:

{ 
    "IntSetting": 5, 
    "StrSetting": "Test str" 
} 

默認行爲跳過靜態屬性:

var x = JsonConvert.SerializeObject(new Settings(), Formatting.Indented); 
+0

請查看此另一個問題:http://stackoverflow.com/questions/24336597/why-cant-json-net-serialize-static-or-const-member-variables –

+0

爲什麼不你想使用'JsonProperty'屬性嗎? – cramopy

+0

它應該有可能使用自定義轉換器 –

回答

5

您可以使用自定義合約解析程序執行此操作。特別是你需要繼承DefaultContractResolver並覆蓋GetSerializableMembers功能:

public class StaticPropertyContractResolver : DefaultContractResolver 
{ 
    protected override List<MemberInfo> GetSerializableMembers(Type objectType) 
    { 
     var baseMembers = base.GetSerializableMembers(objectType); 

     PropertyInfo[] staticMembers = 
      objectType.GetProperties(BindingFlags.Static | BindingFlags.Public); 

     baseMembers.AddRange(staticMembers); 

     return baseMembers; 
    } 
} 

這裏所有我們正在做的是調用的GetSerializableMembers基實現,然後加入public static特性向我們的會員序列名單。

要使用它,你可以創建一個新JsonSerializerSettings對象,並設置ContractResolverStaticPropertyContractResolver的實例:

var serializerSettings = new JsonSerializerSettings(); 

serializerSettings.ContractResolver = new StaticPropertyContractResolver(); 

現在,通過這些設置JsonConvert.SerializeObject,一切都應該工作:

string json = JsonConvert.SerializeObject(new Settings(), serializerSettings); 

輸出:

{ 
    "IntSetting": 5, 
    "StrSetting": "Test str" 
} 

例子:https://dotnetfiddle.net/pswTJW

+0

工程太棒了!謝謝你的幫助。 – Milos

1

解決這方面的一個更復雜的方式:

解決方案1:

public class Settings 
{ 
    int intsetting { get; set; } /*= 0;*/ // commented only allowed in C# 6+ 
    string strsetting { get; set; } /*= "";*/ 

    public int IntSetting { get { return intsetting; } set { intsetting = value; } } 
    public string StrSetting { get { return strsetting; } set { strsetting = value; } } 

    static Settings() 
    { 
     IntSetting = 5; 
     StrSetting = "Test str"; 
    } 
} 

解決方案2:(不太複雜)

public class Settings 
{ 
    [JsonProperty] 
    public static int IntSetting { get; set; } 

    [JsonProperty] 
    public static string StrSetting { get; set; } 

    static Settings() 
    { 
     IntSetting = 5; 
     StrSetting = "Test str"; 
    } 
} 

添加[JsonProperty]到所有變量將是解決這個的easyest方式,但是當你不想使用它解決方案1最適合你。

+0

我想有一種方法來實現/重寫默認JsonConverter行爲,如推薦這裏:http://stackoverflow.com/questions/24336597/why-cant-json-net-serialize-靜態或const的成員變量。但我想這不是一個簡單的解決方案。 – Milos

+0

無論如何,你應該使用'[JsonProperty]'屬性,因爲它正是爲&&做的,如果它對你有幫助,請標記爲答案。 – cramopy

相關問題