2012-02-05 51 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']}}