C# 使用JSON.NET枚举到jQGrid的JSON对象

C# 使用JSON.NET枚举到jQGrid的JSON对象,c#,asp.net,json,enums,json.net,C#,Asp.net,Json,Enums,Json.net,我在尝试将Enum转换为jQGrid的JSON字符串时遇到问题。我以前使用的格式(手动转换)是: {{0:'-',1:'Active',2:'Deactive',3:'Pending'}} public static string GetStatuses(bool addDefault = false) { var statusesEnum = Enum.GetValues(typeof(StatusEnum)); string statuses

我在尝试将
Enum
转换为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);
    }
}
公共类状态JSON
{
公共字节ID{get;set;}
公共字符串名称{get;set;}
公共状态JSON(){}
公共状态JSON(字节id、字符串名称)
{
ID=ID;
名称=名称;
}
}
公共类JSONUtils
{
/// 
///获取JSON中所选对象的所有可能状态
/// 
///身份类型
///检查是否添加默认/空状态
///带有状态的字符串JSON
公共静态字符串GetStatus(类型类型,bool addDefault=false)
{
var statusesEnum=Enum.GetValues(类型);
列表状态=新列表();
如果(添加默认值)
statuses.Add(新的StatusJSON(0,“-”));
foreach(statusesEnum中的var statusEnum)
添加(新的StatusJSON((字节)statusEnum,Enum.GetName(类型,statusEnum));
返回JsonConvert.SerializeObject(状态);
}
}
您可以将其用作:
string statuses=JSONUtils.GetStatuses(typeof(StatusEnum),addDefault)。问题在于,返回的字符串如下:

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


库中有什么方法可以得到我需要的字符串?谢谢

我最后做的是重新使用我的旧代码。现在我有了这个:

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) + "}}";
    }
}
公共类法规
{
公共字节ID{get;set;}
公共字符串名称{get;set;}
公共法规({}
公共法规(字节id、字符串名称)
{
ID=ID;
名称=名称;
}
/// 
///获取所选对象的所有可能状态
/// 
///身份类型
///检查是否添加默认/空状态
///带有状态的列表
公共静态列表SelectAll(类型类型,bool addDefault=false)
{
var statusesEnum=Enum.GetValues(类型);
列表状态=新列表();
如果(添加默认值)
状态。添加(新法规(0,“-”);
foreach(statusesEnum中的var statusEnum)
添加(新法规((字节)statusEnum,Enum.GetName(类型,statusEnum));
返回状态;
}
}
公共类JSONUtils
{
/// 
///获取JSON中所选对象的所有可能状态
/// 
///身份类型
///检查是否添加默认/空状态
///jQGrid的JSON字符串,状态为
公共静态字符串GetStatusesJQGrid(类型,bool addDefault=false)
{
变量状态=法规。选择全部(类型,添加默认值);
字符串结果=“{value:{”;
foreach(status中的status)
result+=String.Format(“{0}:'{1}',”,status.ID,status.Name);
返回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']}

我不认为,因为
{0:'-',1:'Active 2:'Deactive 3:'Pending'}
不是有效的json字符串。也许你应该看看
StringEnumConverter