2012-02-05 92 views
0

我在試圖將Enum轉換爲jQGrid的JSON字符串時出現問題。我用以前的格式(做手工轉換)是這樣的:使用JSON.NET爲jQGrid枚舉JSON對象

{{0: '-', 1: 'Active', 2: 'Deactive', 3: 'Pending'}}

public static string GetStatuses(bool addDefault = false) 
    { 
     var statusesEnum = Enum.GetValues(typeof(StatusEnum)); 
     string statuses = "{value: {0: '-', "; 

     foreach (StatusEnum status in statusesEnum) 
      statuses += String.Format("{0}: '{1}', ", (byte)status, Enum.GetName(typeof(StatusEnum), status)); 

     return statuses.Substring(0, statuses.Length - 2) + "}}"; 
    } 

所以我需要避免這種方法,因爲我覺得是不是這樣做的最好的方法,我想序列化它使用JSON.NET庫。所以我寫了這個:

public class StatusJSON 
{ 
    public byte ID { get; set; } 
    public string Name { get; set; } 

    public StatusJSON() { } 

    public StatusJSON(byte id, string name) 
    { 
     ID = id; 
     Name = name; 
    } 
} 

public class JSONUtils 
{ 
    /// <summary> 
    /// Get all the posible statuses of selected <paramref name="type"/> in JSON 
    /// </summary> 
    /// <param name="type">Type of the status</param> 
    /// <param name="addDefault">Check if add a default/NULL status</param> 
    /// <returns>A string JSON with the statuses</returns> 
    public static string GetStatuses(Type type, bool addDefault = false) 
    { 
     var statusesEnum = Enum.GetValues(type); 
     List<StatusJSON> statuses = new List<StatusJSON>(); 

     if (addDefault) 
      statuses.Add(new StatusJSON(0, "-")); 

     foreach (var statusEnum in statusesEnum) 
      statuses.Add(new StatusJSON((byte)statusEnum, Enum.GetName(type, statusEnum))); 

     return JsonConvert.SerializeObject(statuses); 
    } 
} 

你可以使用它作爲:string statuses = JSONUtils.GetStatuses(typeof(StatusEnum), addDefault);。這個問題比這回喜歡的字符串:

[{"ID":0,"Name":"-"},{"ID":1,"Name":"Active"},{"ID":2,"Name":"Deactive"},{"ID":3,"Name":"Pending"}]

有一個在庫中的任何方法來獲得像我需要一個字符串?謝謝

+0

我不認爲,因爲'{{0: ' - ',1: '有效',2: '去活',3: '待定'} }'不是有效的json字符串。也許你應該看看'StringEnumConverter'類 – 2012-02-05 01:32:37

回答

0

我終於做的是重新使用我的舊代碼。所以,現在我有這個:

public class Statutes 
{ 
    public byte ID { get; set; } 
    public string Name { get; set; } 

    public Statutes() { } 

    public Statutes(byte id, string name) 
    { 
     ID = id; 
     Name = name; 
    } 

    /// <summary> 
    /// Get all the posible statuses of selected <paramref name="type"/> 
    /// </summary> 
    /// <param name="type">Type of the status</param> 
    /// <param name="addDefault">Check if add a default/NULL status</param> 
    /// <returns>A list with the statuses</returns> 
    public static List<Statutes> SelectAll(Type type, bool addDefault = false) 
    { 
     var statusesEnum = Enum.GetValues(type); 
     List<Statutes> statuses = new List<Statutes>(); 

     if (addDefault) 
      statuses.Add(new Statutes(0, "-")); 

     foreach (var statusEnum in statusesEnum) 
      statuses.Add(new Statutes((byte)statusEnum, Enum.GetName(type, statusEnum))); 

     return statuses; 
    } 
} 

public class JSONUtils 
{ 
    /// <summary> 
    /// Get all the posible statuses of selected <paramref name="type"/> in JSON 
    /// </summary> 
    /// <param name="type">Type of the status</param> 
    /// <param name="addDefault">Check if add a default/NULL status</param> 
    /// <returns>A string JSON for jQGrid with the statuses</returns> 
    public static string GetStatusesJQGrid(Type type, bool addDefault = false) 
    { 
     var statuses = Statutes.SelectAll(type, addDefault); 
     string result = "{value: {"; 

     foreach (Statutes status in statuses) 
      result += String.Format("{0}: '{1}', ", status.ID, status.Name); 

     return result.Substring(0, result.Length - 2) + "}}"; 
    } 
} 

你可以使用它作爲:重新使用string statuses = JSONUtils.GetStatusesJQGrid(typeof(StatusEnum), true);

直到我使用JSON.NET我覺得這是一個很好的一段代碼會找到一個更好的辦法對於使用jQGrid的人來說。這是有效的選擇選項:

colModel: {name: 'status_id', label: 'Status', edittype: 'select', sortable: true, search: true, stype:'select', editoptions: " + statuses + @", searchoptions: {sopt: ['eq', 'ne']}}