Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC中准备自定义json格式返回#_C#_Json_Asp.net Mvc - Fatal编程技术网

C# 在MVC中准备自定义json格式返回#

C# 在MVC中准备自定义json格式返回#,c#,json,asp.net-mvc,C#,Json,Asp.net Mvc,我有两个类,即模块中的角色和模块,类我有两个属性名称,权限 现在,为了测试的目的,我正在创建一个演示代码 类文件 控制器代码 这很好,我也得到了结果,但我想要这样的结果 预期结果 目前我得到的结果是这样的是否有任何方法可以修改JSON,删除所有键并仅获取值 注意:如何删除关键属性我只想要名称值和名称中的值再次我不想要所有权限,如例外结果中所述删除模块类并尝试按如下方式更改角色以获得预期的json格式: public class Roles { public Rol

我有两个类,即
模块中的
角色
模块
,类我有两个属性
名称
权限

现在,为了测试的目的,我正在创建一个演示代码

类文件

控制器代码

这很好,我也得到了结果,但我想要这样的结果

预期结果

目前我得到的结果是这样的
是否有任何方法可以修改JSON,删除所有键并仅获取值


注意:如何删除关键属性我只想要名称值和名称中的
再次我不想要所有
权限
,如
例外结果中所述

删除模块类并尝试按如下方式更改角色以获得预期的json格式:

    public class Roles
    {
        public Roles()
        {
            modules = new Dictionary<string, List<string>>();
        }
        public Dictionary<string, List<string>> modules { get; set; }
    }
公共类角色
{
公共角色()
{
模块=新字典();
}
公共字典模块{get;set;}
}
控制器操作代码:

public ActionResult Index()
{   
    var oRoles = new Roles();
    oRoles.modules.Add("Page-Profile", new List<string>{"Edit","View","Delete"});
    oRoles.modules.Add("user", new List<string>{"Edit","View","Delete","Update"});
    // Not sure why you are serializing to json. 
    // you can directly return View(oRoles) or PartialView(oRoles)
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(oRoles);
    return View(json);
}
public ActionResult Index()
{   
var oRoles=新角色();
添加(“页面配置文件”,新列表{“编辑”,“查看”,“删除”});
添加(“用户”,新列表{“编辑”,“查看”,“删除”,“更新”});
//不确定为什么要序列化为json。
//您可以直接返回视图(oRoles)或部分视图(oRoles)
var json=Newtonsoft.json.JsonConvert.SerializeObject(oRoles);
返回视图(json);
}

删除模块类并尝试按如下方式更改角色,以获得预期的json格式:

    public class Roles
    {
        public Roles()
        {
            modules = new Dictionary<string, List<string>>();
        }
        public Dictionary<string, List<string>> modules { get; set; }
    }
公共类角色
{
公共角色()
{
模块=新字典();
}
公共字典模块{get;set;}
}
控制器操作代码:

public ActionResult Index()
{   
    var oRoles = new Roles();
    oRoles.modules.Add("Page-Profile", new List<string>{"Edit","View","Delete"});
    oRoles.modules.Add("user", new List<string>{"Edit","View","Delete","Update"});
    // Not sure why you are serializing to json. 
    // you can directly return View(oRoles) or PartialView(oRoles)
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(oRoles);
    return View(json);
}
public ActionResult Index()
{   
var oRoles=新角色();
添加(“页面配置文件”,新列表{“编辑”,“查看”,“删除”});
添加(“用户”,新列表{“编辑”,“查看”,“删除”,“更新”});
//不确定为什么要序列化为json。
//您可以直接返回视图(oRoles)或部分视图(oRoles)
var json=Newtonsoft.json.JsonConvert.SerializeObject(oRoles);
返回视图(json);
}

实现这一目标有两种方法

  • 通过编写自定义转换器
  • 通过更改角色对象
  • 通过编写自定义转换器

    您可以实现CustomJsonConverter,如下所示,将名称转换为键,将权限转换为值:

    public class FlatternKeysConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            Module o = (Module)value;
            JObject newObject = new JObject(new JProperty(o.Name, o.Permission));
            newObject.WriteTo(writer);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
        }
    
        public override bool CanRead
        {
            get { return false; }
        }
    
        public override bool CanConvert(Type objectType)
        {
            return true;
        }
    }
    
    并将
    JsonConverter

    [JsonConverter(typeof(FlatternKeysConverter))]
    public class Module
    {
        public string Name { get; set; }
        public string[] Permission { get; set; }
    }
    
    生成的JSON如下所示:

    {"modules":[{"Page-Profile":["Edit","View","Delete"]},{"User":["Edit","View","Delete","Update"]}]}
    
    通过更改角色对象

    将角色对象更改为字典

    public class Role
    {
        public class Roles
        {
            public Dictionary<string, List<string>> Modules {get; set;}
        }
    }
    
    公共类角色
    {
    公共类角色
    {
    公共字典模块{get;set;}
    }
    }
    

    您可以查看显示这两种方法的dotnet fiddle。

    有两种方法可以实现它

  • 通过编写自定义转换器
  • 通过更改角色对象
  • 通过编写自定义转换器

    您可以实现CustomJsonConverter,如下所示,将名称转换为键,将权限转换为值:

    public class FlatternKeysConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            Module o = (Module)value;
            JObject newObject = new JObject(new JProperty(o.Name, o.Permission));
            newObject.WriteTo(writer);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
        }
    
        public override bool CanRead
        {
            get { return false; }
        }
    
        public override bool CanConvert(Type objectType)
        {
            return true;
        }
    }
    
    并将
    JsonConverter

    [JsonConverter(typeof(FlatternKeysConverter))]
    public class Module
    {
        public string Name { get; set; }
        public string[] Permission { get; set; }
    }
    
    生成的JSON如下所示:

    {"modules":[{"Page-Profile":["Edit","View","Delete"]},{"User":["Edit","View","Delete","Update"]}]}
    
    通过更改角色对象

    将角色对象更改为字典

    public class Role
    {
        public class Roles
        {
            public Dictionary<string, List<string>> Modules {get; set;}
        }
    }
    
    公共类角色
    {
    公共类角色
    {
    公共字典模块{get;set;}
    }
    }
    

    您可以查看显示这两种方法的dotnet fiddle。

    它对我有效,请尝试以下方法:

    代码


    这对我有用,试试这个:

    代码



    谢谢,伙计,这是完美的工作:)我必须感谢它,兄弟。虽然它对我有效,但我得到的输出是<代码>{“角色”:{“模块”:{“23”:[“编辑”,“更新”],“26”:[“编辑”,“更新”],“35”:[“编辑”,“更新”]}
    但是我想要
    模块
    作为
    数组对象
    @jishansiddique-检查我使用自定义
    JsonConverter的答案
    。它将模块输出为数组--
    {“modules”:[{“Page Profile”:[“Edit”、“View”、“Delete”]},{“User”:[“Edit”、“View”、“Delete”、“Update”]}
    。Dotnet fiddle link-@user1672994,是的,目前我正在寻找你的答案。谢谢,伙计,这是完美的工作:)我必须感谢它,兄弟。虽然它对我有效,但我得到的输出是
    {“角色”:{“模块”:{“23”:[“编辑”,“更新”],“26”:[“编辑”,“更新”],“35”:[“编辑”、“更新”]}}}
    但我想将
    模块
    作为
    数组对象
    @jishansiddique-检查我使用自定义
    JsonConverter
    的答案。它会将模块作为数组输出--{“模块”:[{“页面配置文件”:[“编辑”、“查看”、“删除”},{“用户”:[“编辑”、“查看”、“删除”,”更新“]}]}.Dotnet fiddle link-@user1672994,是的,目前我正在寻找你的答案。没有
    自定义转换器
    有什么办法可以实现它吗?你应该调用它来改变对象结构,或者在不改变结构的情况下实现它。JsonConverter提供了一种干净的方法,不需要任何结构改变如果没有
    自定义转换器
    ,有什么方法可以实现它吗?这是您应该改变对象结构或在不改变结构的情况下实现它的方法。JsonConverter提供了一种干净的方法,不需要任何结构改变。感谢您的答案,如何修复多个
    模块
    请查看m我刚才提到的y答案。编辑了我的代码,添加了一个foreach用于多个条目,在这种情况下可能会起作用,请修改,我正在尝试我也做了相同的代码等一下,我会检查一下,现在让你知道。谢谢你的答案如何修复mu